我正在阅读Boost数组文档,我看到这一行:
如果您使用的是C ++ 11,则应考虑使用std :: array而不是boost :: array
我的印象是Boost,因为它的主要库,总是比标准库更好,因为:
所以我更倾向于优先于stdlib?
如果不是/更复杂,我的哪些假设需要纠正?
答案 0 :(得分:24)
我认为您应该在可用时使用标准库,因为......它是标准的,并随编译器一起提供。此外,如果你使用boost,你需要一个恼人的外部依赖。
所以,我的建议是:尽可能使用std。如果您正在编写可移植代码,也必须使用旧编译器编译,您可以考虑使用自己的命名空间(例如:cxx0x)根据您正在使用的编译器嵌入std或boost命名空间(这称为名称空间别名):
#ifdef COMPILER_HAS_CXX0X
#include <memory>
namespace cxx0x = std;
#else
#include <boost/shared_ptr.hpp>
namespace cxx0x = boost;
#endif
...
cxx0x::shared_ptr< MyClass > = ...
答案 1 :(得分:3)
取自Boost人自己:
组织为什么要使用Boost?
总之,生产力。用于 像Boost这样的高质量图书馆 加速初步开发,结果 减少错误,减少 重新发明,削减 长期维护费用。从那以后 Boost库往往成为de 事实上或法律上的标准,很多 程序员已经熟悉了 它们。
十个Boost库是 包含在C ++标准库中 TR1,等等以后会全部完成 标准化。更多Boost库 TR2正在筹备中。运用 Boost库为组织提供了支持 采用新的先机 技术。
许多组织已经使用了程序 与Adobe一样使用Boost实现 Acrobat Reader 7.0。
答案 2 :(得分:2)
根据我自己的经验,我现在更喜欢使用boost。也许这是历史性的,但是我发现VC2008附带的TR1中的STD尝试有太多的错误,尽管PJ Plauger做出了最好的努力,但他无法再现经过同行评审和检查的提升代码的质量。相当一段历史。
除非他们能够实际使用增强代码并在STD中使用它,为什么他们会更好地再现它?当然,有时候他们可能,而且他们真的应该共同努力,而不是相互对抗。
我现在做的一件事就是声明一个别名命名空间,通常称为spns
:
namespace spns = boost;
之后我可以在我的代码中使用spns::shared_ptr
(spns代表“共享指针命名空间”),如果我们以后更改为std,那么很容易去一个地方并编辑该行和包括
对于C ++ 11,标准有重大改变,而boost的代码是C ++ 03。所以现在这些表可能会转向库的某些部分。我认为一些boost的优秀库对于C ++ 11来说几乎已经过时了,例如没有人会再使用boost::lambda
,他们只会使用lambda的新语言语法。
所以,是的,当你转向C ++ 11时,可能是时候放弃升级库的一部分并使用新版本了。
答案 3 :(得分:1)
我在针对C ++ 11开发的开源软件中看到的趋势是从STD移动API兼容(子集)功能以提升 - 因为提升可用于非C ++ 11兼容编译器,其中标准特征(显然)不是。
这方面的好例子是mosh。
对于API兼容的功能,只需切换命名空间即可。事实上,如果可以的话,没有理由不将它作为配置选项。
补充工具栏:如果您要链接最新版本的非标头加速库,请预先警告某些功能不再可用,除非使用-std=c++11
编译了boost。我最近遇到了boost::filesystem
API中的某些函数。
答案 4 :(得分:1)
如果某些东西可以标准化,那就让它成为标准。 如果某些事情不能,请尽可能使用更标准的解决方案(而BOOST就是为此设计的)
许多标准库功能都来自boost,它继续存在以支持那些尚未标准化的功能部署的应用程序。
对标准化功能使用boost实际上是“向后看”。有时需要(可能是标准库特定的实现不包括所有需要的...通常在Windows上看到boost :: thread而不是std :: thread,因为某些编译器还没有移植std实现)但我不会成为一个规则。