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

简介: 你正在寻找一个高质量的,开源的,与平台和编译器无关的程序库的集合?看一下Boost吧。想加入一个由雄心勃勃的,充满天赋的正致力于最高水平的程序库设计和实现工作的C++程序员们组成的团体么?看一下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 using namespace boost::lambda;       // make boost::lambda
 2 // functionality visible
 3 
 4 std::vector<int> v;
 5 ...
 6 std::for_each(v.begin(), v.end(),         // for each element x in
 7 
 8 
 9 std::cout << _1 * 2 + 10 << "\n"); // v, print x*2+10;
10 // “_1” is the Lambda
11 // library’s placeholder
12 // for the current element

 

  • 泛型编程,包含了大量的traits class。(见 Item 47
  • 模板元编程(见Item 48),包括为编译时断言提供的程序库,还有Boost MPL 程序库。MPL支持编译时实体的像STL一样的数据结构,例如types:

     

1 // create a list-like compile-time container of three types (float,
2 // double, and long double) and call the container “floats”
3 typedef boost::mpl::list<float, double, long double> floats;
4 // create a new compile-time list of types consisting of the types in
5 // “floats” plus “int” inserted at the front; call the new container “types”
6 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组件的实现,但也提供了许多其它的程序库。


作者: HarlanC

博客地址: http://www.cnblogs.com/harlanc/
个人博客: http://www.harlancn.me/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接

如果觉的博主写的可以,收到您的赞会是很大的动力,如果您觉的不好,您可以投反对票,但麻烦您留言写下问题在哪里,这样才能共同进步。谢谢!

目录
相关文章
|
C++ 安全
读书笔记 effective c++ Item 51 实现new和delete的时候要遵守约定
Item 50中解释了在什么情况下你可能想实现自己版本的operator new和operator delete,但是没有解释当你实现的时候需要遵守的约定。遵守这些规则并不是很困难,但是它们其中有一些并不直观,所以知道这些规则是什么很重要。
883 0
|
存储 C++
读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来
1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法。你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定的类和300个你需要的函数。
753 0
|
数据安全/隐私保护 C++ 编译器
读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字
1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息。消息可以以加密或者明文(未加密)的方式被发送。如果在编译阶段我们有足够的信息来确定哪个信息会被发送到哪个公司,我们可以使用基于模板的解决方案:   1 class CompanyA { 2 public: 3 .
898 0
|
程序员 C++ 容器
读书笔记 effective c++ Item 42 理解typename的两种涵义
1. class和typename含义相同的例子 问题:在下面的模板声明中class和typename的区别是什么? 1 template class Widget; // uses “class” 2 3 template class Widget; // uses “typename”   答案:没有任何区别。
891 0
|
C++ 编译器
读书笔记 effective c++ Item 41 理解隐式接口和编译期多态
1. 显示接口和运行时多态 面向对象编程的世界围绕着显式接口和运行时多态。举个例子,考虑下面的类(无意义的类), 1 class Widget { 2 public: 3 Widget(); 4 virtual ~Widget(); 5 6 virtual std::...
1051 0
|
C++
读书笔记 effective c++ Item 37 永远不要重新定义继承而来的函数默认参数值
从一开始就让我们简化这次的讨论。你有两类你能够继承的函数:虚函数和非虚函数。然而,重新定义一个非虚函数总是错误的(Item 36),所以我们可以安全的把这个条款的讨论限定在继承带默认参数值的虚函数上。
1065 0
|
C++ 编译器
读书笔记 effective c++ Item 36 永远不要重新定义继承而来的非虚函数
1. 为什么不要重新定义继承而来的非虚函数——实际论证 假设我告诉你一个类D public继承类B,在类B中定义了一个public成员函数mf。Mf的参数和返回类型并不重要,所以假设它们都是void。
880 0
|
程序员 C++
读书笔记 effective c++ Item 34 区分接口继承和实现继承
看上去最为简单的(public)继承的概念由两个单独部分组成:函数接口的继承和函数模板继承。这两种继承之间的区别同本书介绍部分讨论的函数声明和函数定义之间的区别完全对应。 1. 类函数的三种实现 作为一个类设计者,有时候你只想派生类继承成员函数的接口(声明)。
1037 0
|
C++
读书笔记 effective c++ Item 32 确保public继承建立“is-a”模型
1. 何为public继承的”is-a”关系 在C++面向对象准则中最重要的准则是:public继承意味着“is-a”。记住这个准则。 如果你实现一个类D(derived)public继承自类B(base),你在告诉c++编译器(也在告诉代码阅读者),每个类型D的对象也是一个类型B的对象,反过来说是不对的。
811 0
|
Java C++
读书笔记 effective c++ Item 31 把文件之间的编译依赖降到最低
1. 牵一发而动全身 现在开始进入你的C++程序,你对你的类实现做了一个很小的改动。注意,不是接口,只是实现,而且是private部分。然后你需要rebuild你的程序,计算着这个build应该几秒钟就足够了。
811 0
热门文章
最新文章
推荐文章
更多