【问题标题】:What are the Best Components of Boost? [closed]Boost 的最佳组件是什么? [关闭]
【发布时间】:2010-10-09 08:57:31
【问题描述】:

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

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

事实上,有些库在我看来有点像玩具。

我可以看到许多相当容易访问的库在经过很短的调查后就可以使用,例如 boost::variant(我真的很喜欢 visitor em> 组件以及如果访问者缺少一种变体类型的运算符,编译器会出错)。我会使用 boost::shared_ptr,除了我们的组已经有一组智能指针类型。

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

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

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

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

【问题讨论】:

    标签: c++ boost utility


    【解决方案1】:

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

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

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

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

    • 提升 Asio

      • 与第一印象相反(至少在一段时间之前),它不仅仅是网络库。它提供了几乎可以用于任何事情的异步 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 中等)和显示好处的简单示例。

    【讨论】:

      【解决方案2】:

      在设计跨平台(例如 *nix 和 win32)多线程应用程序(boost::threadboost::interprocess)时,我发现 boost 是无可争议的必备。仅此而已至少在一种情况下,我有足够的理由将boost 作为我雇主项目的一部分。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

            Boost interprocess 如果您正在使用共享内存之类的东西做事,那绝对值得。

            【讨论】:

              【解决方案6】:

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

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

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

              【讨论】:

              • 这样吗?你是说包含 boost 将支持: for_each(a.begin(), a.end(), std::cout
              • Boost lambda 完全可以做到这一点。
              • Boost::Lambda 太烦人了,不能用于任何比这更复杂的事情,至少对我来说是这样。
              【解决方案7】:

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

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

              【讨论】:

                【解决方案8】:

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

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

                【讨论】:

                • 作为一般性评论,我认为您是正确的。但是和智能指针一样,我的团队有一个成熟的框架,包括硬件和文件系统抽象、跨网络数据可移植性等。因此对更高层次的概念很感兴趣。
                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

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

                  【讨论】:

                  • 我下载了它,并浏览了一些我已经为其编写玩具程序的库,似乎这些只是 Boost 库附带的文档的 PDF 文件?对他们中的一些人来说不是这样吗?
                  • 不,就我所知,仅此而已。
                  【解决方案11】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 2010-09-29
                    • 1970-01-01
                    • 2017-08-30
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-03-28
                    • 1970-01-01
                    相关资源
                    最近更新 更多