Effective C++ Third Edition 55 Specific Ways to Improve Your Programs and Designs
By Scott Meyers
Item.55: Familiarize yourself with Boost.

条款55 :熟悉 Boost

                                                                                                                                    吴尔平译 2005-6-16 

 

    你正在寻找一个高品质的、开源的且平台和编译器无关的库的集合?关注 Boost。你是否对加入一个雄心勃勃的社区感兴趣,而这里有才华的开发者们正在设计和实现一个拥有最先进技术水平的库?关注 Boost 。想一睹 C++ 未来的样子?关注 Boost 。

    Boost 是所有C++ 开发者的社区;是可以自由下载的C++ 库的集合。它的WEB站点是http://boost.org,你应该现在就将它加入你的书签。

    当然,存在许多C++ 组织和站点,但 Boost有两点被认为是其它组织所不能比拟的。首先,它唯一地与 C++ 标准委员会之间有着紧密和有影响力的关系。Boost 是由委员会成员所创建,且现在 Boost 成员与委员会成员之间继续保持着许多的交迭。除此之外,Boost的目标之一就是为可能加入到C++标准中的能力但当测试环境。这一切的结果是 14 个新加入到 TR1 (看条款 54) 中的库有超过 2/3 以 Boost 的工作为基础。

    第二个特别特性是它接受库的程序。它基于公开的同级评审(peer review)。如果你想贡献你的库给 Boost,你必须先将它张贴到Boost的开发者邮件列表上以便估计这个库的影响,同始开始你工作的预选审查程序。如此进入一个被boost概述为“讨论、精练,多次提交直到感到满意”的循环。

    最终,你判断你的库已经为正式提交做好了准备。评审经理(review manager)将确认你的库是否符合 Boost 的最低要求。例如:它必须能够在至少两个平台上编译(以证明名义上的可移植性),你必须证明它能在可接受的授权下使用(举例来说,库必须充许商业和非商业使用)。然后,Boost社团才对你的库进行正式评审(official review)。在评审期间,志愿者会对库的材料(源代码、设计文档,用户手册…)仔细地检查并考虑下面的问题:

      设计和实现如何?

      代码是否跨越编译器和操作系统?

      库对它的目标用户,也就是说对在库所处领域工作的人是否有用?

      文档是否清晰、完整,正确?

    这些内容将被张贴到 Boost 的邮件列表,以便评审者和其它人能浏览并回应彼此的评论。评审周期的最后,由评审经理决定这个库是被接受,被有条件的接受还是被拒绝。

    同级评审使得编写糟糕的库不会被纳入Boost 库中,也促使库的作者考虑问题时深入到工业强度的跨平台的库的设计,实现和文档化之中。多数库需要不止一次的正式评审才能够被正式纳入Boost库中。

    Boost 包含许多库,且在持续的增加。有时,其中一些库也会被移除,一般是因为它们的功能已经被提供了更强功能或更好设计(举例说:更有弹性或更有效率)的新库替代。

    这些库的大小和领域大幅度地变化。一个极端是概念上仅几行代码的库(当然还会有更多的错误处理和移植性的代码被添加)。Conversion 就是这样的一个库,它提供更加安全和便利的 cast 操作。它的 numeric_cast 函数,在转换一个 numeric value 从一个类型到另一个类型导致溢出或下溢或一个类似的问题时会拋出一个异常,而 lexical_cast 支持 operator<< 转换任意类型到一个 string,这对于诊断和日志等非常有用。在另一个极端,一些库提供如此广泛的能力,以至于要用整本书来描述它们。它们包括Boost Graph Library(用任意的 graph structures 编程)和 Boost MPL Library("metaprogramming library")。

    Boost众多的库致力于丰富的主题,它们被划分到超过一打的分类里。包括:

 

  • 字符串和文本处理,包括类型安全(type-safe) 的形如printf的格式化库,正则表达式(TR1中相似的功能的基础,看条款54),tokenizing 和 parsing

 

  • 容器,包括STL风格接口的大小固定的数组(fixed-size arrays),可变大小bitsets,和多维数组(multidimensional arrays.)。

 

  • 函数对象(Function objects)和高阶编程(higher-order programming),包括几个TR1中作为功能性基础使用的库。一个有趣的库是 Lambda, 它使得凭空创建一个函数对象(function objects)如此容易,你甚至不需要知道到你做了什么:

 

              using namespace boost::lambda;    //使 boost::lambda

                                                                  //可见

              std::vector<int> v;

              ...

              std::for_each(v.begin(), v.end(),     //遍历v中的元素x

              std::cout << _1 * 2 + 10 << "\n"); //输出 x*2+10;

                                                                  // "_1"是Lambda

                                                                  //为当前元素设置的置位符

 

  • 泛型编程(Generic programming),包括一个traits类的扩展集(看条款 47关于traits 的资料)。

 

  • 模板元编程(Template metaprogramming TMP 看条款 48), 包括一个Boost MPL 这样的编译期断言库(compile-time assertions)。在MPL极好事情之一是支持STL风格的形如类型(types)的编译期实体的数据结构。

 

              //创建一个形如list(list-like)的编译期容器,容器包括3种数据类型(float, double 和 long

              //double),并命名为 "floats"。

              typedef boost::mpl::list<float, double, long double> floats;

 

     

              //创建一个新的编译期的由"floats"及在其前端插入的"int"所组成类型的list;并命名新的

              //容器为"types"。

             typedef boost::mpl::push_front<floats, int>::type types;

 

    包涵各种数据类型的容器(经常被称为typelists,虽然他们也基于mpl::list和mpl::vector创建) 打开了通向强大且重要的TMP应用的广阔天地。

 

  • 数学和数值(Math and numerics),包括有理数库(rational numbers);octonions和四元数(quaternions);最大公约数(greatest common divisor)和最小公倍数(common multiple computations);随机数(另一个影响TR1相关功能的库)。

 

  • 正确性和测试(Correctness and testing),包括形式化隐式模板接口(formalizing implicit template interfaces (阅读条款 41)) 方便测试优先(test-first) 编程。

 

  • 数据结构(Data structures),包括类型安全的unions库(例:存储变量的"any"类型)和导致相应TR1功能的tuple库。

 

  • 交互语言支持(Inter-language support),包括充许在C++和Python之间进行无缝协作的库。

 

  • 内存,包括高性能的固定大小分配的Pool库;多样的智能指针,包括(但不限于)在TR1中的智能指针。非TR1智能指针是scoped array, 为动态分配数组的auto_ptr风格的智能指针; 条款44展示一个使用的例子。

 

  记住,以上这些只是你能在Boost中找到的库的一部分。它并不是一个无遗漏的列表。

  Boost提供库能完成很多事情,但它并未覆盖整个编程领域。例如,没有GUI开发用的库,也没有与数据库通讯的库。至少在我写这本书的时候还没有。当你读到它时,可能,也许会有。所以了解Boost库集合内容的唯一正确的方法明白如何去检索。我建议你立刻去读http://boost.org。甚至你并不真正知道你想要什么时,也必然能在这里找到一些有趣的东西。

  请记住以下事实:

    Boost 是一个自由,开源,同级评审的C++ 库的开发社区和站点,Boost在C++标准中扮演了一个有影响力的角色。

    Boost 不但提供了一些TR1的实现,还提供了其它一些库。