30

我一直在浏览 Boost 库的修订版 1.38.0,试图确定那里是否有足够的珠宝来证明谈判我公司的外部软件审批流程是合理的。在编写测试程序和阅读文档的过程中,我得出了几个结论

  • 当然,并不是 Boost 中的所有东西都可以在我的工程组中使用
  • 更重要的是,其中一些库似乎比其他库更精致

事实上,一些图书馆对我来说似乎有点像玩具。

有许多相当容易访问的库在经过很短的调查后就可以使用,例如boost::variant(我真的很喜欢访问者组件以及如果访问者缺少一个变体类型之一)。我会使用boost::shared_ptr,除了我们的组已经有一组智能指针类型。

所以基于 Stack Overflow 用户的广泛经验,Boost 库

  • 有高品质吗?
  • 不仅仅是玩具?
  • 有没有什么入门门槛高但值得学习的?

请注意,这与Boost中提出的问题有些不同,认为有害吗?

PS - 是否删除了答案之一(来自 litb)?我在这里看不到它,只有我的用户页面上的摘录...

4

11 回答 11

19

我经常使用(它让我的生活更简单):

  • 智能指针(shared_ptr, scoped_ptr, weak_ptr, interprocess unique_ptr):

    • scoped_ptr基本 RAII(无共享所有权和所有权转让),免费。
    • shared_ptr对于更复杂的操作 - 当需要共享所有权时。不过也有一些成本。
    • unique_ptr- boost 正在积极开展工作,将各种方法(目前在 Boost 中)unique_ptr与移动仿真结合起来。
    • 它们非常易于使用(仅标题),易于学习且经过很好的测试(好吧,也许除了unique_ptr
  • Boost Thread - 积极开发(线程现在是可移动的)库,用于处理线程。隐藏给定平台上线程实现的复杂性。

  • Boost MPL 和 Fusion——这些更难解释。很长一段时间我都没有使用编译时的能力,但是经过一些阅读和学习后,我发现我的一些代码可以很好地简化。不过,请注意编译时间...

  • 提升亚西欧

    • 与第一印象相反(至少在一段时间前),它不仅仅是网络库。它提供了几乎可以用于任何事情的异步 I/O 模型。
  • Boost Format(强大的输出格式,但很重)

  • Boost Spirit2x(Karma 和 Qi 用于根据给定语法解析和生成输出)。非常强大,无需借助外部工具即可创建解析器。然而编译时间可能是个问题。版本 2x 也正在积极开发中,文档相当稀缺(但精神开发邮件列表非常有帮助)

  • Boost Bind、Function 和 Lambda 让您的生活更轻松和 Boost Phoenix - 只是为了试验

  • lexical_cast(类似的东西可能很快就会诞生为 boost::string)

  • Regex/Xpressive - 正则表达式

  • 类型特征和概念检查 - 再次让您的生活更轻松

  • 数学:

    • 各种随机数发生器
    • 各种统计分布
    • ublas - 用于在 C++ 中以类似方式使用 LAPACK/BLAS 绑定
    • 一些数学函数,通常在 C++ 中不可用
    • 一些用于控制数字类型之间转换的工具
    • 区间算术
  • Boost Iterator(用于迭代器的专用适配器和用于创建您自己的外观)

  • Boost 单元测试框架

还有一些我在 Boost 中几乎没有接触过的部分。可能我也忘了提到几个明显的。

记住使用正确的工具(锤子)解决正确的问题(钉子)。请记住保持解决方案简单。记住接收功能的成本(例如shared_ptrboost::format运行时开销或 MPL/Fusion/Spirit/Phoenix 编译时间成本和可执行文件大小)。但实验和学习——这就是乐趣所在。

在说服管理层使用新图书馆时,您不必从所有图书馆开始。从简单的事情开始(可能是那些具有长期稳定的 Boost 历史、广泛的编译器支持、计划包含在 TR2/C++1x 中等)和显示好处的简单示例。

于 2009-02-23T18:17:13.280 回答
13

在设计跨平台(例如 *nix 和 win32)多线程应用程序时,我发现它是无可争议的必备品(. )boost仅此一项就足以在至少一个实例中作为我雇主项目的一部分采用。boost::threadboost::interprocessboost

其余的(容器、通用编程和元编程、内存)作为免费赠品紧随其后。

于 2009-02-23T17:24:55.620 回答
8

我经常使用boost::filesystem. 它完成了简单文件管理所需的一切

于 2009-02-23T17:22:04.473 回答
6

我想说有价值的图书馆是:

  • 元编程 (MPL, enable_if, type/function_traits)
  • 预处理器 - 如果您需要它,它可能会派上用场
  • 变体,可选 - 正如您已经注意到的
  • 数学 - 四元数,额外的数学函数(尽管它们可能对你没有用)
  • lambda:虽然语法很复杂,但很容易上瘾
  • 运算符/迭代器:在构建自己的类型时它们非常方便

也许是 Python(从未尝试过,但有些例如 KDE 程序使用它)

于 2009-02-23T17:23:08.980 回答
5

如果您正在使用共享内存等做事,那么提升进程间绝对是值得的。

于 2009-02-23T17:23:04.470 回答
4

如果您使用 STL,Boost::lambda 会有所帮助。它使您能够就地创建谓词,如下所示:

for_each(a.begin(), a.end(), std::cout << _1 << ' ');

此代码输出容器中用空格分隔的所有元素。

于 2009-02-23T17:18:00.147 回答
4

C++0x 标准库的许多新增内容最初是作为 Boost 库的一部分创建的。

它们并不完美(任何软件),但使用的工程过程非常强大(远远超过大多数免费软件)。如果您确实需要帮助,您会在邮件列表中找到很多。

于 2009-02-23T17:18:16.183 回答
4

我个人认为你应该看看隐藏平台特定内容的库,如线程、ipc、内存映射文件、文件系统、异步 IO 等。

这些可以在多平台项目中为您节省大量时间和麻烦,并且往往专注于公开功能而不是花哨的 C++ 功能的练习。

于 2009-02-23T17:24:49.410 回答
4

如果您需要解析比简单的键/值对更复杂的文本文件,我强烈推荐Boost::spirit。它有很高的学习曲线,但是一旦你弄清楚了,它就可以让你轻松地将 EBNF 语法嵌入到代码中。它比编写自己的解析器要健壮得多。我还发现自己创建的文件格式更便于文件编写者而不是解析代码的编写者。

于 2009-02-23T17:28:25.067 回答
2

我发现 boost.thread 和 boost.asio 对于编写客户端/服务器应用程序是必不可少的。智能指针库使编写使用异常处理的代码变得容易而不会泄漏内存。

附带说明一下,最近发布了一组 PDF 文件,其中记录了一些更常见的 boost 库。您可以从SourceForge下载它们。

于 2009-02-23T17:36:20.943 回答
2

我已阅读其他答案,我需要添加 Boost.Graph (BGL) 及其朋友 Boost.Property_map。这两个字面上改变了我的日常工作。

It is extremely well designed, but most people are put off at first because there is quite a high price to pay before actually understanding the purpose of all concepts. But once you get a grip on this library, it becomes hard to go without !

于 2009-02-24T07:19:25.600 回答