什么是Boost的最佳组件?

时间:2009-02-23 17:14:10

标签: c++ boost utility

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

  • 当然,Boost中的所有内容都不会在我的工程组中使用
  • 更重要的是,其中一些库看起来比其他库更精致

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

我可以看到一些相当容易访问的库,经过短时间的调查后才能使用,例如 boost :: variant (我非常喜欢 visitor 组件以及如果访问者缺少其中一种变体类型的运算符,编译器会barfs的事实。我使用 boost :: shared_ptr 除了我们的组已经有一组智能指针类型这一事实。

所以基于Stack Overflow用户的丰富经验,Boost库

  • 有高品质吗?
  • 不仅仅是玩具?
  • 是否存在任何具有较高进入障碍但值得学习的内容?

请注意,这与Boost considered harmful?

中提出的问题略有不同

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

12 个答案:

答案 0 :(得分:18)

我经常使用(这让我的生活变得更简单):

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

    • scoped_ptr用于基本RAII(无共享所有权和所有权转让),免费。
    • shared_ptr用于更复杂的操作 - 需要共享所有权时。但是有一些费用。
    • unique_ptr - 通过移动模拟将各种方法(在Boost中)统一到unique_ptr,积极推进工作。
    • 它们非常易于使用(仅限标题),易于学习且经过良好测试(好吧,除了unique_ptr
  • Boost Thread - 主动开发(线程现在是可移动的)库,用于处理线程。隐藏了给定平台上线程实现的复杂性。

  • 提升MPL和融合 - 这些更难以解释。很长一段时间我没有使用编译时的电源,但经过一些阅读和学习后发现我的一些代码可以很好地简化。但是,要注意编译时间......

  • Boost Asio

    • 与第一印象相反(至少在不久前),它不仅仅是网络库。它提供了几乎可用于任何事物的异步I / O模型。
  • 提升格式(强大的输出格式,但非常重)

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

  • 提升Bind,Function和Lambda让您的生活更轻松,提升凤凰 - 只是为了实验

  • lexical_cast(类似的东西可能很快就会出现在boost :: string中)

  • Regex / Xpressive - 正则表达式

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

  • 数学:

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

  • 提升单元测试框架

还有一些我在Boost中几乎没有碰过的部分。可能我也忘了提几个显而易见的。

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

当说服管理层使用新库时 - 您不必从所有库开始。从简单的事情开始(可能是那些具有长期稳定的Boost历史,广泛的编译器支持,计划包含在TR2 / C ++ 1x中的事物等)以及显示其优点的简单示例。

答案 1 :(得分:13)

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

其余的(容器,泛型编程和元编程,内存)随后都是免费赠品。

答案 2 :(得分:8)

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

答案 3 :(得分:5)

Boost interprocess绝对是值得的,如果你正在做共享内存&之类的。

答案 4 :(得分:5)

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

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

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

答案 5 :(得分:4)

如果你使用STL,

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

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

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

答案 6 :(得分:4)

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

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

答案 7 :(得分:4)

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

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

答案 8 :(得分:3)

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

答案 9 :(得分:2)

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

另外,最近发布了一组记录一些更常见的boost库的PDF文件。您可以从SourceForge下载它们。

答案 10 :(得分:2)

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

它设计得非常好,但大多数人一开始就被推迟了,因为在真正了解所有概念的目的之前需要付出相当高的代价。但是一旦掌握了这个图书馆,就很难没有了!

答案 11 :(得分:1)

不完全相同的问题,但应该有助于回答你的问题:Most used parts of Boost