读书笔记 effective c++ Item 55 让你自己熟悉Boost

你正在寻找一个高质量的,开源的,与平台和编译器无关的程序库的集合?看一下Boost吧。想加入一个由雄心勃勃的,充满天赋的正致力于最高水平的程序库设计和实现工作的C++程序员们组成的团体么?看一下Boost吧。想了解C++将来可能会是什么样子的?看一下Boost吧。

Boost是一个C++开发人员组

的团体,也是供免费下载的C++程序库的集合。网址是http://boost.org

1. Boost的两大优势

当然,有许多C++组织和网站,但是Boost有两点是其它组织不能与之媲美的。首先,它和C++标注委员会有着紧密的关系,并且对C++标准委员会有影响力。Boost是由C++标准委员会成员创立的,所以Boost和委员会成员之间有很大的重叠。此外,Boost的其中一个目标是为能够加入标准C++的功能提供一个实验场地。这种关系的一个结果就是由TR1引入到C++中的14个新的程序库中,有多于2/3的程序库是基于Boost的工作成果。

2. Boost库的收录流程

Boost的第二个特殊的特征就是接受程序库的过程。它是在同行评审的基础之上进行的。如果你想向Boost贡献一个程序库,你先向Boost开发人员发送邮件,让他们评估程序库的重要性,然后开始对你工作进行初步的审查。这就开始了一个循环流程,网站将其总结为“讨论,精炼,重发。重复这个流程直到委员会满意为止。”

最后,你决定你的程序库已经准备好正常的提交了。审查经理确认你的程序库满足了Boost的最低需求。例如,必须在至少两个编译器上编译通过(为了确保可移植性),你也必须确保这个程序库在可接受的license下能够被使用(例如,程序库必须允许在商业和非商业的使用中是免费的。)然后Boost委员会就能获得你提交的程序库了,他们会进行官方的审查。在审查期间,志愿者会仔细检查你的程序库材料(例如,源码,设计文档,使用说明文档等等),并且会考虑如下问题:

  • 设计和实现有多好?
  • 在不同编译器和操作系统上是可移植的么?
  • 程序库对于受众群体——也就是使用这个程序库处理问题的人们——是否有用?
  • 文档是否清晰,完整,精确?

这些注释会发送到Boost邮件列表中,所以审查人员和其他人能够看到,并可以对其它人的评论做出反馈。在审查的最后,审查经理决定你的程序库是否被接受,有条件的接受或者被拒绝。

同行评审可以将实现的不好的程序库排除在外,也同样能够帮助程序库的作者,教他们如何对工业强度的,跨平台的程序库进行设计,实现和撰写文档。许多程序库在被声明其有价值并被接受之前,需要不止一次的官方评审。

Boost包含了大量的程序库,更多的是在大家贡献的基础上进行添加的。一些程序库也会时不时的被移除掉,因为这些功能被更新的程序库取代了,它们提供了更棒的功能或者更好的设计(例如,更加灵活或者更加高效。)

3. Boost库有大有小

Boost程序库在大小和范围上有很大不同。一个极端是程序库只在概念上需要几行代码(但是如果支持错误处理和增加可移植性会需要更长的代码。)有一个这样的程序库叫做Conversion,它提供了更加安全或者说更加方便的cast操作。例如,它的numeric_cast函数,如果从一个数值类型转换到另外一个数值类型的时候导致内存溢出或者类似的问题,异常就会抛出;lexical_cast使得把支持operator<<的任何类型转换成string成为可能,这对诊断和记录日志是非常有帮助的。另外一个极端是程序库提供了非常广泛的功能,整本书都用来介绍它们。这样的程序库包含Boost Graph Library(支持使用任意的图表结构来进行编程),还有Boost MPL Library(“元编程库”)。

4. Boost库的分类

Boost程序库处理了一系列的主题,它们被分成一些种类。这些种类包括:

  • 字符串和文本处理,包括类型安全的能够像printf一样进行格式化,正则表达式(这是在TR1中提供的类似的功能的基础)tokenizing和解析。
  • 容器,包括固定大小的数组,它有一个类似STL的接口(见Item 54),容量可变的bitset和多维数组。
  • 函数对象和高级编程,包括被当作TR1中功能基础的一些程序库。一个有趣的程序库是Lambda程序库,使得创建函数对象非常简单,你甚至不太可能意识到你在做什么:
1
2
3
4
5
6
7
8
9
10
11
using namespace boost::lambda; // make boost::lambda
// functionality visible
std::vector<int> v;
...
std::for_each(v.begin(), v.end(), // for each element x in
std::cout << _1 * 2 + 10 << "\n"); // v, print x*2+10;
// “_1” is the Lambda
// library’s placeholder
// for the current element
  • 泛型编程,包含了大量的traits class。(见 Item
    47
  • 模板元编程(见Item 48),包括为编译时断言提供的程序库,还有Boost MPL 程序库。MPL支持编译时实体的像STL一样的数据结构,例如types:
1
2
3
4
5
6
// create a list-like compile-time container of three types (float,
// double, and long double) and call the container “floats”
typedef boost::mpl::list<float, double, long double> floats;
// create a new compile-time list of types consisting of the types in
// “floats” plus “int” inserted at the front; call the new container “types”
typedef boost::mpl::push_front<floats, int>::type types;

这种类型的容器(被人熟知的是typelist,虽然它们也可以基于一个mpl::vector或者mpl::list)为一系列强大和重要的TMP应用打开了大门。

  • 数学和数字,包括为有理数提供的库;八元数和四元数;最大公约数和最小公倍数的计算;还有随机数(虽然这是另外一个影响TR1中的相关功能的库。)
  • 正确性和测试,包括为形式化隐式模板接口提供的程序库(Item 41)和使测试先行更加容易的程序库。
  • 数据结构,包括为类型安全的union提供的程序库,还有实现了TR1中相对应功能的tuple库。
  • 内存,包括为高性能的固定大小的内存分配器提供的Pool库(见Item
    50
    );一些列的智能指针(Item
    13
    ),包括但不限于TR1中的智能指针。一个这样的非TR1智能指针为scoped_array,一个像auto_ptr一样的为动态分配数组提供的智能指针;Item
    44
    提供了一个实例。
  • 杂项,包括为CRC校验提供的库,日期和时间操作的库,在文件系统上移动的库。

记住,这只是Boost中的一部分程序库。并没有把所有的都列出来。

Boost提供的库可以做很多事情,但是不能做所有事情。例如,没有为GUI开发提供的库,也没有同数据库进行通信的库。至少现在没有。但是当你读到这本书的时候可能就有了。了解它们的唯一方式就是核实。我建议你现在就做:http://boost.org。即使你没有发现你想要的,你肯定能够发现一些有趣的东西。

5. 总结

  • Boost是一个社区和网站,它为开发人员提供了免费的,开源的,经过同行评审的C++程序库。Boost对C++标准有影响力。
  • Boost提供了许多TR1组件的实现,但也提供了许多其它的程序库。