这里有很多C++问题的答案包含响应:
"你应该使用boost::(在这里插入你最喜欢的智能指针)或者更好的提升:(在这里插入你最喜欢的超级复合增强型)"
我完全不相信这对提问者有任何好处,而提问者总的来说是明显的C++新手.我的理由如下:
使用智能指针而不了解幕后发生的事情会导致一代C++程序员缺乏程序员的一些基本技能.这似乎已经发生在Java领域了.
决定使用哪种类型的智能指针在很大程度上取决于要解决的问题域.从这里发布的问题中几乎总是缺少这一点,所以简单地说"使用共享指针"可能至少是无益的,可能是完全错误的.
Boost还不是C++标准的一部分,可能无法在提问者使用的特定平台上使用.安装它有点痛苦(我只是使用Jam),如果你想要的只是一些智能指针,那就太过分了.
如果您正在编写FOSS代码,那么您不希望代码严重依赖外部库,而您的用户可能再也没有.由于库之间依赖关系的拜占庭复杂性,我在很多场合都被推迟使用FOSS代码.
总而言之,我并不是说不推荐Boost,而是在这样做时我们应该更加小心.
几点:
使用任何不理解的东西都被视为有害 但只有无知的技术用户(和他的经理)才最终被烧毁.
您不必安装boost来获取智能指针 - 它们只是标题.安装本身相当简单,只需键入一个或两个命令,最简单的方法.
许多Boost库和解决方案都存在于TR1中,或者存在于C++ 0x中
您将始终依赖外部库...尝试选择在维护和支持方面具有光明前景的库.
除非你想推出自定义解决方案 - 这将有一些优点和缺点.
C++不是一种新手友好的语言.向Scott Meyers道歉,初学者不是只用C++学习一种语言,而是四种语言:
C部分
面向对象的部分:类,继承,多态等.
STL:容器,迭代器,算法
模板和元编程
我认为,如果初学者已经攀登这座山,那么他们应该从一开始就指向C++的"现代"方面.否则就意味着初学者将通过常规指针,资源泄漏等学习C-ish C++.在痛苦的世界中找到自己,然后发现Boost和其他库作为阻止伤害的方法.
无论如何,这都是一幅复杂的画面,为什么不将它们指向一个对投入的精神上有正面回报的方向呢?
至于依赖关系,很多Boost只是头文件.而Boost的自由许可应该允许它包含在任何项目中.
你知道编译器是如何工作的吗?你知道操作系统是如何工作的吗?你知道处理器是如何工作的吗?你知道电子产品的工作原理吗?你知道电的工作原理吗?
在某些时候,你正在使用黑匣子,问题是,"我目前正在做的事情是我的无知问题吗?".
如果你对知识的兴趣是一件好事 - 我在采访工程师时显然认为这是一个优点 - 但不要忘记工作的最终结果:构建解决问题的系统.
我不同意.没有人会建议您在没有彻底了解幕后发生的事情的情况下深入了解智能指针,但明智地使用它们可以消除一大堆常见错误.此外,Boost是高质量的生产代码,C++新手可以从设计和实现方面学到很多东西.它也不是非常复杂,你可以选择你需要的位.
一直彻底理解一切都是不可能的.因此,请接受许多专业C++开发人员的说法,即升级的许多部分确实是非常有用的东西,可用于您的日常开发.
在C++ 0X中包含了相当多的提升,这证明即使是管理语言演变的团队也认为提升是一件好事(tm)
C++是一种奇怪而强硬的语言.与掌握难度难度相比,它相对容易学习.你可以用它做一些非常神秘的事情.Boost :: mpl建立在一些神秘的东西上.我喜欢提升,但每当我看到组织中的某个人使用boost :: mpl时,我都会感到畏缩.原因是:即使是经验丰富的C++开发人员也无法解决它的工作原理,而使用它的代码经常会反映出这种情况(最终看起来像是有人将代码撞出来直到它起作用).这不是一件好事,所以我部分同意不应该谨慎使用boost的某些部分(boost :: spirit是另一个例子).
C++标准也是一个奇怪的事情.大多数常见的编译器都没有实现所有现有标准(例如模板导出).这只是预期的指导方针.
如果您的开发人员没有精明的人来决定在特定情况下使用哪个智能指针,那么在没有高级指导的情况下,他们可能不应该在代码的那部分中搞乱.
总是有外部库,从运行时开始.很多提升的是仅标头所以它并没有引入新的外部依赖.
坦率地说,对于初学者来说,我认为提升并不是那么合适.我认为初学者最好在使用更高级别的工具/库(如boost或甚至STL)提升食物链之前了解基础知识的工作原理.在初学阶段,它不是关于生产力,而是关于理解.我想知道指针是如何工作的,例如手动创建链表或排序链表是每个程序员应该学习的基础知识的一部分.
我认为提升是一个很棒的图书馆.我喜欢它.我最喜欢的库是boost :: bind和boost :: function,它使函数指针更灵活,更易于使用.它非常适合不同的框架,并保持代码整洁.
我也使用不同的Boost类.例如,我使用boost :: graph来创建图形类,我使用boost :: filesystem来处理目录中的文件.
但是,提升非常复杂.您需要成为一名经验丰富的程序员才能了解其价值.此外,您需要具备至少一些C++经验,以了解Boost如何工作以及在此处或那里使用Boost的含义.
因此,我强烈建议为有经验的程序员查看Boost,特别是如果他们试图重新发明轮子(再次).它真的可以说是锡上所说的:促进你的目标.
但是,如果您觉得提问的人是初学者并试图理解(例如)内存分配,告诉他尝试提升智能指针是一个非常糟糕的主意.它根本没用.只有当人们体验到标准内存分配技术如何工作时,才能理解智能指针类等的优点.
为了完成,提升是不喜欢学习驾驶汽车自动变速箱.这就像学习驾驶F1赛车一样.
我完全同意你的看法.这是我首先向他们解释应该如何做的原因(即当推荐boost :: variant时,我解释他们应该通常使用一个有区别的联盟.而且我尽量不说它只是一个"神奇的提升物"但是显示他们原则上如何实现它.当我推荐boost :: shared_ptr时,我解释他们需要使用指针 - 但最好使用具有共享所有权语义的智能指针.).boost::xxx
当我看到提问者是初学者时,我尽量不说"使用".它是一种不像某些脚本语言那样简单易用的语言.人们必须理解使用的东西,因为语言不能保护程序员不做坏事.
当然,新手不可能从一开始就理解一切.但他们应该了解他们的升级库解决了什么以及基本如何解决它.
您无法首先将其与学习处理器或汇编语言进行比较.类似地,知道空指针的位模式是什么样子并不重要.了解这些与使用C++学习编程无关.但是C++中的指针,数组或任何其他基本内容都不是.在使用[boost|std]::shared_ptr
或之前,人们无法学习它们[boost|std]::array
成功.在我看来,为了成功使用boost工具,必须先了解这些内容.这不是关于如何使用原始指针手动实现pimpl-idiom的细节 - 这不是我正在做的事情.但问题是,首先应该了解指针的基本内容或者升级库帮助的其他部分(例如,指针,它们是什么以及它们有什么用处).只需查看shared_ptr手册,并尝试在不知道指针的情况下获取它.不可能.
始终将它们指向适当的助推手册非常重要.提升手册质量很高.
几乎所有答案的共识是,对于有经验的开发人员和复杂的现实世界的C++软件来说,提升是非常有价值的.我完全同意.
我还认为,提升能对初学者非常有价值的.使用lexical_cast比使用ostringstream更容易吗?或者使用BOOST_FOREACH而不是迭代器语法?最大的问题是缺乏良好的助推器文档,特别是初学者.我们需要的是一本书,它将告诉您如何从boost开始,哪些库是简化任务的简单库,以及哪些库更复杂.使用这些库和良好的文档将使IMO更容易学习C++.
我们应尽可能鼓励使用标准的固定库(并且Boost几乎和它们一样标准).
有些人似乎认为初学者应该首先学习C++的C方面,然后再引入更高级别的东西.然而,人们倾向于在他们接受培训的情况下工作,因此我们将看到许多使用管理不当的原始指针编写的生产代码(管理良好的原始指针有时非常困难),数组(以及删除之间不可避免的混淆)并删除[]),以及类似的东西.我曾经使用过这样的代码.我不想再这样做了.
以您希望他们编写代码的方式启动初学者.这意味着首先要教他们关于STL容器和算法以及一些Boost库,所以他们在需要一组东西时首先想到的是vector <>.然后教他们较低级别的结构,这样当他们遇到它们时,或者在需要微观优化的极少数情况下,他们会知道它们(或者在哪里查找它们).
基本上有两种类型的程序员:编程人员,他们应该按照编写语言的方式教授语言,以及将学习低级内容的发烧友,包括操作系统原理,C,汇编代码等等. .通过学习他们预先使用的语言,两者都可以得到很好的服务,而只有通过学习一些任意级别的基础知识才能为爱好者提供良好的服务.
我不同意.当然,从头开始编码时,您将始终比使用第三方库时更了解所有内部工作原理.但是时间和金钱都是有限的,使用好的第三方库(如boost)是节省资源的一种非常好的方法.
我认为你混合了许多不同的问题,并非所有问题都与Boost有关:
首先,应该鼓励程序员(或C++新手专门)使用他们不理解的库,习语,范例,语言或语言功能吗?
不,当然不.每个程序员都应该理解他们使用的工具,尤其是像C++这样的语言.但是,在这里我没有看到很多关于鼓励人们不理解他们正在使用的代码的问题.当人们说他们想用C++做X时,我认为它会说"Boost有一个X的实现,它不仅仅是一个自制的解决方案,所以要用它".
当然,如果问题是"X如何工作",那么"使用Boost的实现"就无法回答这个问题.但是我真的没有看到推荐Boost用于前一类问题的问题.
我也看不出如何使用Boost而不了解引擎盖下发生了什么.无论有没有Boost,C++都不是Java.使用Boost绝不会保护您免受语言的复杂性.你还担心拷贝构造函数,指针算术,模板和其他一切可以在你的脸上炸毁.
这与Java中发生的情况完全不同.他们设计了一种能够消除所有细微之处的语言.提升不会那样做.恰恰相反,它在通用编程方面开创了新的习语和技术.使用Boost并不总是很简单.
关于Boost的可用性,我认为这不是问题.它可用于绝大多数的问题,使用的平台,如果他们不能够使用升压,建议仍然不是有害的,只是没用.
此外,大多数Boost库只是标题库,不需要您安装整个库.如果您只想要智能指针,只需包含这些标题即可.
关于自由和开放源码软件,在某些情况下你有一点意见但是我认为这对于用户没有的通用库来说是一个问题.但是,升压是非常普遍的,如果人们没有它,他们应该得到它,因为它是适用于几乎所有的问题域.当然,许可证与您关注的任何FOSS项目兼容.我宁愿研究一个OSS项目,该项目使用Boost进行繁重的工作,而不是重新发明自己的(有缺陷的和专有的)车轮,并且可以避免陡峭的学习曲线.
所以是的,在某些情况下,推荐Boost是无益的.但我不知道它有多害.
在任何情况下,我看不出它如何能连一半同样有害教新手推出自己的.在C++中,这是灾难的秘诀.这就是为什么C++仍然以容易出错并生成有缺陷的软件而闻名的唯一原因.因为很长时间以来,人们从头开始写一切,不信任标准库,不信任第三方代码,不信任C中不合法的一切.