条款 55: 让自己熟悉Boost
Familiarize yourself with Boost.
你正在寻找一个高质量、源码开放、平台独立、编译器独立的程序库吗?看看Boost吧。有兴趣加入一个由雄心勃勃充满才干的C++开发人员组成的社群,致力发展(设计和实现)当前最高技术水平之程序库吗?看看Boost吧!想要一瞥未来的C++可能长相吗?看看Boost吧!
Boost是一个C++开发者集结的社群,也是一个可自由下载的C++程序库群。它的网址是http://boost.org。现在你应该把它设为你的桌面书签之一'。
当然,世上多得是C++组织和网站,但Boost有两件事是其他任何组织无可匹敌的。第一,它和C++标准委员会之间有着独一无二的密切关系,并且对委员会深具影响力。Boost由委员会成员创设,因此Boost成员和委员会成员有很大的 重叠.Boost有个目标:作为一个“可被加入标准C++之各种功能”的测试场。这层关系造就的结果是,以TR1 (见条款54)提案进入标准C++的14个新程序库中,超过三分之二奠基于Boost的工作成果。
Boost的第二个特点是:它接纳程序库的过程。它以公开进行的同僚复审(public peer review)为基础。如果你打算贡献一个程序库给Boost,首先要对Boost开发者电邮名单(mailing list)投递作品,让他们评估这个程序库的重要性,并启动初步审查程序。然后开始这个网站所谓的“讨论、琢磨、再次提交”循环周期,直到一切都获得满足为止。
最后,你准备好你的程序库,要正式提交了。会有一位复审管理员出面确认你 的程序库符合Boost最低要求。例如它必须通过至少两个编译器(以展现至此仍还微不足道的可移植性),你必须证明你的程序库在一个可接受的授权许可下是可用的(例如这个程序库必须允许免费的商业化和非商业化用途)。然后你的提交正式进入Boost社群,等待官方复审。复审期间会有志愿者察看你的程序库各种素材(例如源码、设计文档、使用说明等等),并考虑诸如此类的问题:
■这一份设计和实现有多好?
■这些代码可跨编译器和操作系统吗?
■这个程序库有可能被它所设定的目标用户——也就是在这个程序库企图解决问题的领域中工作的人们——使用吗?
■文档是否清楚、齐备,而且精确?
所有批注都会被投寄至一份Boost邮件列表,所以复审者和其他人可以看到并响应其他人的评论。复审最后周期结束之后,复审管理员便表决你的程序库被接受、被有条件接受,或被拒绝。
同僚复审对于阻挡低劣的程序库很有贡献,同时也教育程序库作者认真考虑一个工业强度、跨平台的程序库的设计、实现和文档工程。许多程序库在被Boost接受之前往往经历了一次以上的官方复审。
Boost内含数十个程序库,而且还不断有更多添加进来。偶尔也会有程序库被从中移除,通常那是因为它们的机能已被新程序库取代,而新程序库提供了更多、更好的机能,或更好的设计(例如更弹性或更有效率)。
Boost各程序库之间的大小和作用范围有很大变化。举一个极端例子,某些程序库概念上只需数行代码(但在加入错误处理和可移植性后往往变长很多)。例如Conversion程序库,提供较安全或较方便的转型操作符,其numeric_cast函数在将数值从某类型转换为另一类型而导致溢出(overflow)或下溢(underflow)或类似问题时会抛出异常。lexical_cast则使我们得以将任何类型(只要支持operator<<)转换为字符串,对程序的诊断和运转志记(logging)都十分有用。另一个极端例子是某些程序库提供大面积能力,甚至可以写成一整本书,这类程序库包括Boost Graph Library(用于编写任意graph结构)和Boost MPL Library(一个元编程程序库,metaprogramming library)。
Boost程序库对付的主题非常繁多,区分数十个类目,包括:
■字符串与文本处理,覆盖具备类型安全(type-safe)的printf-like格式化动作、 正则表达式(此为TR1同类机能的基础,见条款54),以及语汇单元切割 (tokenizing)和解析(parsing)。
■容器,覆盖“接口与STL相似且大小固定”的数组(见条款54)、大小可变的bitsets以及多维数组。
■函数对象和离级编程,覆盖若干被用来作为TR1机能基础的程序库。其中一个有趣的程序库是Lambda,它让我们得以轻松地随时随地创建函数对象,但是你 颇有可能不太了解你正在做什么:
using namespace boost:: lambda; //让 boost:: lambda 的机能曝光
std::vector v;
…
std:: for_each (v.begin (), v.end(), //针对 v 内的每一个兀素 x,
std: :cout<<_1 2 + 10 << "\n"); //印出 x 2+10;
//其中"_1"是Lambda程序库
/针对当前元素的一个
//占位符号(placeholder)
■泛型编程(Generic programming),覆盖一大组 traits classes。关于traits 请见条款47。
■模板元编程(Template metaprogramming, TMP,见条款48),覆盖一个针对编 译期assertions而写的程序库,以及Boost MPL程序库。MPL提供了极好的东西,其中支持编译期实物(compile-time entities)诸如types的STL-like数据结
构,等等。
//创建一个list-like编译期容器,其中收纳三个类型:
// (float, double, long double),并将此容器命名为"floats”
typedef boost::mpl::list floats;
//再创建一个编译期间用以收纳类型的list,以”floats”内的类型为基础,
//最前面再加上"int"。新容器取名为"types"。
typedef boost::mpl::push_front::type types;
这样的“类型容器”(常被称为typelists——虽然它们也可以以一个mpl::vector 或mpl: :list为基础)开启了一扇大门,通往大范围、火力强大且重要的TMP应用程序。
■数学和数值(Math and numerics),包括有理数、八元数和四元数(octonions and quaternions)、常见的公约数(divisor)和少见的多重运算、随机数(又一个影响TR1内部相关机能的程序库)。
■正确性与测试(Correctness and testing),覆盖用来将隐式模板接口(implicit template interfaces,见条款41)形式化的程序库,以及针对“测试优先”编程形态而设计的措施。
■数据结构,覆盖类型安全(type-safe)的unions(存储各具差异之“任何”类型),以及tuple程序库(它是TR1同类机能的基础)。
■语言间的支持(Inter-language support),包括允许C++和Python之间的无缝互操作性(seamless interoperability)。
■内存,覆盖Pool程序库,用来做出高效率而区块大小固定的分配器(见条款50),以及多变化的智能指针(smartpointers,见条款13),包括(但不仅仅是)TR1智能指针。另有一个non-TRl智能指针是scoped_array,那是个auto_ptr-like 智能指针,用来动态分配数组;条款44曾经示范其用法。
■杂项,包括CRC检验、日期和时间的处理、在文件系统上来回移动等等。
请记住,这只是可在Boost中找到的程序库抽样,不是一份详尽清单。
Boost提供的程序库可以做很多很多事,但它并未覆盖整套编程风光。例如其中就没有计对GUI开发而设计的程序库,也没有用以连通数据库的程序库——至少在我下笔此刻没有。然而当你阅读本书时就有了也说不定。到底有没有唯一可以确定的办法是常常上网检核。我建议你现在就去访问:http://boost.org。纵使你没能找到刚好符合需求的作品,也一定会在其中发现一些有趣的东西。
请记住 ■Boost是一个社群,也是一个网站。致力于免费、源码开放、同僚复审的C++程 序库开发。Boost在C++标准化过程中扮演深具影响力的角色。
■Boost提供许多TR1组件实现品,以及其他许多程序库。