读书笔记 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程序库,使得创建函数对象非常简单,你甚至不太可能意识到你在做什么:
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 * + << "\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:
// 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组件的实现,但也提供了许多其它的程序库。
读书笔记 effective c++ Item 55 让你自己熟悉Boost的更多相关文章
- 读书笔记 effective c++ Item 54 让你自己熟悉包括TR1在内的标准库
1. C++0x的历史渊源 C++标准——也就是定义语言的文档和程序库——在1998被批准.在2003年,一个小的“修复bug”版本被发布.然而标准委员会仍然在继续他们的工作,一个“2.0版本”的C+ ...
- 读书笔记 effective c++ Item 13 用对象来管理资源
1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, class Investment { ... ...
- 读书笔记 effective c++ Item 18 使接口容易被正确使用,不容易被误用
1. 什么样的接口才是好的接口 C++中充斥着接口:函数接口,类接口,模板接口.每个接口都是客户同你的代码进行交互的一种方法.假设你正在面对的是一些“讲道理”的人员,这些客户尝试把工作做好,他们希望能 ...
- 读书笔记 effective c++ Item 50 了解何时替换new和delete 是有意义的
1. 自定义new和delete的三个常见原因 我们先回顾一下基本原理.为什么人们一开始就想去替换编译器提供的operator new和operator delete版本?有三个最常见的原因: 为了检 ...
- 读书笔记 effective c++ Item 48 了解模板元编程
1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...
- 读书笔记 effective c++ Item 1 将c++视为一个语言联邦
Item 1 将c++视为一个语言联邦 如今的c++已经是一个多重泛型变成语言.支持过程化,面向对象,函数式,泛型和元编程的组合.这种强大使得c++无可匹敌,却也带来了一些问题.所有“合适的”规则看上 ...
- 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数
关于构造函数的一个违反直觉的行为 我会以重复标题开始:你不应该在构造或者析构的过程中调用虚函数,因为这些调用的结果会和你想的不一样.如果你同时是一个java或者c#程序员,那么请着重注意这个条款,因为 ...
- 读书笔记 effective c++ Item 11 在operator=中处理自我赋值
1.自我赋值是如何发生的 当一个对象委派给自己的时候,自我赋值就会发生: class Widget { ... }; Widget w; ... w = w; // assignment to sel ...
- 读书笔记 effective c++ Item 12 拷贝对象的所有部分
1.默认构造函数介绍 在设计良好的面向对象系统中,会将对象的内部进行封装,只有两个函数可以拷贝对象:这两个函数分别叫做拷贝构造函数和拷贝赋值运算符.我们把这两个函数统一叫做拷贝函数.从Item5中,我 ...
随机推荐
- Servlet中过滤器的执行流程
- layer弹出层框架alert与msg详解
ayer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力.目前,layer ...
- spring知识点全部复习
一. 专业术语 侵入式设计 引入框架,对现有的类的结构有影响,即需要实现或继承某些特定类.如:Struts框架 非侵入式设计 引入框架,对现有的类结构没有影响.如:Hibernate.Spring 控 ...
- MySQL数据库设计总结
规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过10 ...
- python实现TCP/UDP通信
一.说明 对于TCP/udp的说明已经很多了,我在这里只是简单的说明一下 二.套接字scoket 套接字是一种具有之前所说的"通信端点"概念的计算网络数据结构.相当于电话插口,没它 ...
- String及其常用API
String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因 ...
- 【2017-03-20】HTML基础知识、文字标记、图片标记、空格换行、表格、表格嵌套及布局、超链接
一.HTML基础知识 HTML: 网站(站点) - 网页 网站是由一个或者多个网页组合起来的 HTML作为文件后缀名,可以把文件变为网页 HTML是一门编程语言的名字:超文本标记语言 超越了文字的范畴 ...
- Linux学习之Vim使用
一 为何要学Vim 所有的Unix Like系统都有自带vi编辑器 一些软件的编辑接口会自动调起vi 作为vi的升级版,vim具有程序编辑功能,而且具有代码颜色高亮显示.辨别代码的正确性等功能 以上优 ...
- 谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画!
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- mybatis的学习笔记
前几天学习了mybatis,今天来复习一下它的内容. mybatis是一个基于Java的持久层框架,那就涉及到数据库的操作.首先来提出第一个问题:java有jdbc连接数据库,我们为什么还要使用框架呢 ...