28

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

如果你使用 C++11,你应该考虑使用 std::array 而不是 boost::array

我的印象是,对于它的主要库,Boost 总是比标准库更可取,因为:

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

那么我更喜欢 boost 而不是 stdlib 是对的吗?

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

4

5 回答 5

27

我认为您应该在可用时使用标准库,因为...它是标准的并且随编译器一起提供。此外,如果你使用 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 > = ...
于 2013-01-15T09:57:06.140 回答
4

取自Boost人自己:

为什么组织应该使用 Boost?

一句话,生产力。使用像 Boost 这样的高质量库可以加速初始开发,减少错误,减少轮子的重新发明,并降低长期维护成本。而且由于 Boost 库倾向于成为事实上或法律上的标准,许多程序员已经熟悉它们。

C++ 标准库的 TR1 中包含 10 个 Boost 库,因此计划在以后进行完全标准化。更多 Boost 库正在为 TR2 准备中。使用 Boost 库可以让组织在采用新技术方面处于领先地位。

许多组织已经使用通过 Boost 实现的程序,例如 Adob​​e Acrobat Reader 7.0。

于 2013-01-15T09:53:05.630 回答
2

根据我自己的经验,我现在更喜欢使用 boost。也许这是历史原因,但我发现 VC2008 附带的 TR1 中的 STD 尝试有太多错误,尽管 PJ Plauger 尽了最大努力,但他无法重现经过同行评审和检查的 boost 代码的质量相当多的历史。

除非他们实际上可以获取 boost 代码并在 STD 中使用它,否则为什么他们会更好地重现它?当然,有时他们可能会,而且真的应该一起努力,而不是互相对抗。

我现在做的一件事是声明一个别名命名空间,通常spns这样调用:

namespace spns = boost;

之后我可以spns::shared_ptr在我的整个代码中使用(spns 代表“共享指针命名空间”),如果我们以后更改为 std,那么很容易去一个地方并只编辑该行和包含。

说到 C++11,标准有很大的变化,boost 的代码是 C++03。所以现在桌子很可能会转向图书馆的某些部分。我认为一些 boost 的优秀库对于 C++11 来说几乎已经过时了,例如,没有人会再使用boost::lambda了,他们只会对 lambda 使用新的语言语法。

所以是的,当你迁移到 C++11 时,可能是时候放弃部分 boost 库并使用新版本了。

于 2013-01-15T10:03:25.017 回答
1

如果某件事可以是标准的,那就让它成为标准。如果不能,请尽可能使用更标准的解决方案(BOOST 就是为此而设计的)

许多标准库功能都取自 boost,它们继续存在以支持在那些尚未标准化的功能时部署的应用程序。

将 boost 用于标准化功能实际上是一种“向后看”。有时是必要的(可能是标准库特定的实现不包括所有需要的东西......通常会在 Windows 上看到 boost::thread 而不是 std::thread,因为一些编译器尚未移植 std 实现)但我不会把它定为规则。

于 2013-01-15T10:14:24.790 回答
1

我在针对 C++11 开发的开源软件中看到的趋势是将 API 兼容(子集)特性从 STD 转移到 boost——因为 boost 可用于非 C++11 兼容的编译器,其中 std 特性(显然)不是。

mosh就是一个很好的例子。

对于 API 兼容的功能,只需切换命名空间即可。事实上,如果可以的话,没有理由不将其作为配置选项。

侧边栏:如果您要链接到最新版本的非仅头文件 boost 库,请预先警告某些功能不再可用,除非 boost 是用-std=c++11. boost::filesystem我最近在API中使用某些函数时遇到了这个问题。

于 2013-01-15T10:08:35.623 回答