Boost最好的组件是什么?

31

我一直在浏览Boost库的1.38.0版本,试图判断是否有足够的宝石来证明与公司的外部软件批准流程谈判是值得的。在编写测试程序和阅读文档的过程中,我得出了一些结论:

  • 当然,并非所有Boost中的内容都适用于我的工程组
  • 更重要的是,其中一些库似乎比其他库更加成熟

事实上,对我来说,有些库似乎有点玩具般。

有一些相当易于使用的库,我可以看到只需进行短期调查即可投入使用,例如boost::variant(我真的很喜欢visitor组件以及如果访问者缺少一个变量类型的运算符,编译器会报错的事实)。我会使用boost::shared_ptr,除了我们的小组已经有一套智能指针类型之外。

因此,基于Stack Overflow用户的广泛经验,哪些Boost库

  • 质量高?
  • 不仅仅是玩具?
  • 是否有一些入门门槛很高,但却值得学习的库?

请注意,这与Boost considered harmful?中提出的问题略有不同。

P.S. - 是否已经删除了其中一个答案(来自litb)?我在这里看不到它,只有我的用户页面上的摘录...

11个回答

20

我经常使用以下内容(它们让我的生活更简单):

  • 智能指针(shared_ptrscoped_ptrweak_ptr、进程间unique_ptr):

    • scoped_ptr用于基本的RAII(不涉及共享所有权和所有权转移),无需代价。
    • shared_ptr用于更复杂的操作——当需要共享所有权时。但是,这会带来一些代价。
    • unique_ptr——在Boost上有积极的工作,将unique_ptr的各种方法(在Boost中存在)与移动仿真统一起来。
    • 它们非常易于使用(仅需要头文件),易学且经过充分测试(嗯,除了可能的unique_ptr
  • Boost Thread - 一个用于处理线程的库,正在积极开发(现在可移动)。它隐藏了在特定平台上实现线程的复杂性。

  • Boost MPL和Fusion - 这些比较难解释。长时间以来,我没有使用编译时强大功能,但是经过一些阅读和学习,发现我的一些代码可以得到很好的简化。不过,要注意编译时间......

  • Boost Asio

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

  • Boost Spirit2x(Karma和Qi都用于解析和生成基于给定语法的输出)。非常强大,可以创建一个解析器而无需使用外部工具。但是编译时间可能会成为问题。此外,版本2x正在积极开发中,文档相对较少(spirit-devel邮件列表非常有帮助)

  • Boost Bind、Function和Lambda,让你的生活更轻松,以及Boost Phoenix - 只是用来进行实验

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

  • 正则表达式/ Xpressive - 正则表达式

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

  • 数学:

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

  • Boost单元测试框架

  • 仍然有一些我几乎没有涉及的Boost部分。 可能我也忘记了提到几个明显的部分。

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

    而且,当涉及说服管理层使用新库时-您不必从所有库开始。 从简单的事情开始(可能是具有悠久而稳定的Boost历史记录,广泛的编译器支持,计划纳入TR2 / C ++ 1x等)以及演示收益的简单示例。


    13

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

    其余的内容(容器、通用编程和元编程、内存)都是免费的附赠礼品。


    8

    我经常使用boost::filesystem。它可以完成简单文件管理的所有必要操作。


    6
    我认为有价值的库包括:
    • 元编程(MPL,enable_iftype/function_traits
    • 预处理器 - 如果需要的话,可能会派上用场
    • variantoptional - 就像你已经注意到的那样
    • 数学 - 四元数、额外的数学函数(虽然它们可能对你没有用)
    • lambda函数:尽管语法很糟糕,但它非常令人着迷
    • 运算符/迭代器:在构建自己的类型时非常方便

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


    5

    Boost interprocess 是一个非常值得使用的工具,特别是在处理共享内存等方面。


    4
    Boost::lambda对于使用STL的人来说有一定帮助。它使您能够直接创建谓词,例如:
    Boost::lambda
    for_each(a.begin(), a.end(), std::cout << _1 << ' ');
    

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


    你是说包含Boost库可以支持这样的语句吗:for_each(a.begin(), a.end(), std::cout << _1 << ' ');? - Sasha
    Boost Lambda 允许这样做。 - Richard
    1
    Boost :: Lambda实在是太烦人了,对于我来说除了一些简单的东西外,就不能用它做更复杂的事情了。 - Head Geek

    4
    许多 C++0x 标准库的新增内容最初都是作为 Boost 库的一部分而创建的。 它们并不完美(任何软件都不是),但所使用的工程流程相当健壮(比大多数免费软件要好得多)。如果您需要帮助,您会在邮件列表中找到很多帮助。

    4

    我个人认为你应该看一下那些隐藏平台特定内容的库,例如线程,进程间通信,内存映射文件,文件系统,异步IO等。

    这些库可以在多平台项目中节省大量时间和麻烦,并且往往专注于暴露功能而不是炫酷的C++特性练习。


    1
    作为一般性的评论,我认为你说得很对。但是就像智能指针一样,我的团队拥有一个成熟的框架,其中包括硬件和文件系统抽象、跨网络数据可移植性等等。因此,我们对高级概念很感兴趣。 - Don Wakefield

    4

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


    2
    我发现boost.thread和boost.asio对于编写客户端/服务器应用程序是不可或缺的。智能指针库使得编写使用异常处理的代码变得容易,而不会泄漏内存。
    顺便说一下,最近发布了一组PDF文件,记录了一些常见的boost库。您可以从SourceForge下载它们。

    我已经下载了它,并且浏览了一些我已经为其编写玩具程序的库,看起来这些只是随 Boost 库一起提供的文档的 PDF 文件?对于其中的一些不是这样吗? - Don Wakefield
    不,就我所知道的,就是这样。 - Head Geek

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接