我们应该更喜欢Boost还是标准lib?

时间:2013-01-15 09:50:36

标签: c++ boost

我正在阅读Boost数组文档,我看到这一行:

  

如果您使用的是C ++ 11,则应考虑使用std :: array而不是boost :: array

我的印象是Boost,因为它的主要库,总是比标准库更好,因为:

  • 提升永远不会比标准的lib
  • 更差
  • 提升可能会提供更多功能
  • 提升最终质量与标准lib相同(编写C ++标准的人员是主动提升开发人员/主管)
  • 几年后,
  • 主要提升功能最终会出现在标准库中

所以我更倾向于优先于stdlib?

如果不是/更复杂,我的哪些假设需要纠正?

5 个答案:

答案 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实现)但我不会成为一个规则。