本书是市面上第一本专门讨论Boost库的著作。书中首先概括性地简介了Boost的所有58个库,然后全面深入地阐述了12个十分有用的Boost库,展示了它们如何与C++标准库配合以及如何扩展C++标准库。
本书不仅介绍了Boost库的功能、使用方法及注意事项,而且还深入讨论了Boost库的设计理念、解决问题的思想和技巧以及待处理的问题。因此,本书是一本了解Boost库并探索其机理的实用手册。
第Ⅰ部分 通用库
第1章 Smart_ptr库 3
1.1 Smart_ptr库如何改进程序 3
1.2 何时需要智能指针 3
1.3 Smart_ptr库如何适用于
标准库 4
1.4 智能指针scoped_ptr 5
1.4.1 头文件 5
1.4.2 成员 5
1.4.3 自由函数 6
1.4.4 使用方法 7
1.4.5 不需要手动删除 7
1.4.6 和智能指针auto_ptr
几乎一样 8
1.4.7 智能指针scoped_ptr和pimpl
惯用法 9
1.4.8 智能指针scoped_ptr不同
于const auto_ptr 11
1.4.9 小结 11
1.5 智能指针scoped_array 11
1.6 智能指针shared_ptr 12
1.6.1 头文件 12
1.6.2 成员 14
1.6.3 自由函数 16
1.6.4 使用方法 16
1.6.5 回顾Pimpl惯用法 17
1.6.6 智能指针shared_ptr和标准
库容器 17
1.6.7 智能指针shared_ptr和其他
资源 19
1.6.8 使用自定义删除工具
的安全性 20
1.6.9 从this创建智能指针
shared_ptr 21
1.6.10 小结 22
1.7 智能指针shared_array 23
1.8 智能指针intrusive_ptr 23
1.8.1 头文件 23
1.8.2 成员 24
1.8.3 自由函数 25
1.8.4 使用方法 25
1.8.5 提供引用计数器 26
1.8.6 把this用作智能指针 29
1.8.7 支持不同的引用计数器 30
1.8.8 小结 32
1.9 智能指针weak_ptr 33
1.9.1 头文件 33
1.9.2 成员 33
1.9.3 使用方法 34
1.9.4 一个常见的问题 35
1.9.5 两种从weak_ptr创建
shared_ptr的惯用法 38
1.9.6 小结 39
1.10 Smart_ptr库小结 39
第2章 Conversion库 41
2.1 Conversion库如何改进程序 41
2.2 polymorphic_cast转型函数 41
2.2.1 头文件 41
2.2.2 使用方法 42
2.2.3 向下转型和交叉转型 42
2.2.4 dynamic_cast和polymorphic
_cast的对比 44
2.2.5 polymorphic_cast并不总是
正确的选择 45
2.2.6 小结 46
2.3 polymorphic_downcast
转型函数 47
2.3.1 头文件 47
2.3.2 使用方法 48
2.3.3 小结 49
2.4 numeric_cast转型函数 49
2.4.1 头文件 49
2.4.2 使用方法 50
2.4.3 将较大的类型赋值给较小
的类型 50
2.4.4 特殊情况:目标类型是
无符号整数 52
2.4.5 有符号和无符号整数类型
的混用 53
2.4.6 浮点类型 54
2.4.7 小结 55
2.5 lexical_cast转型函数 56
2.5.1 头文件 56
2.5.2 使用方法 56
2.5.3 使lexical_cast函数工作
的方法 56
2.5.4 用lexical_cast函数进行
泛型编程 57
2.5.5 使类适用于lexical
_cast函数 58
2.5.6 小结 59
2.6 Conversion库小结 59
第3章 Utility库 61
3.1 Utility库如何改进程序 61
3.2 BOOST_STATIC_ASSERT
断言 61
3.2.1 头文件 61
3.2.2 使用方法 62
3.2.3 函数作用域中的BOOST
_STATIC_ASSERT 62
3.2.4 小结 63
3.3 checked_delete函数 63
3.3.1 头文件 63
3.3.2 使用方法 64
3.3.3 到底发生了什么问题 64
3.3.4 使用checked_delete解决
问题 66
3.3.5 小结 66
3.4 noncopyable类 67
3.4.1 头文件 67
3.4.2 使用方法 67
3.4.3 使类无法复制的方法 68
3.4.4 使用noncopyable类 69
3.4.5 记住Big Three定律 69
3.4.6 小结 71
3.5 addressof函数 71
3.5.1 头文件 71
3.5.2 使用方法 71
3.5.3 快速了解一下怀有
恶意的人 72
3.5.4 其他问题的迅速解决方法 72
3.5.5 小结 73
3.6 enable_if函数 73
3.6.1 头文件 73
3.6.2 使用方法 75
3.6.3 小结 79
3.7 Utility库小结 79
第4章 Operators库 81
4.1 Operators库如何改进程序 81
4.2 Operators库如何适用于
标准库 82
4.3 Operators库 82
4.3.1 头文件 82
4.3.2 解引用运算符 85
4.3.3 复合算术运算符 86
4.4 使用方法 87
4.4.1 对比较运算符的支持 88
4.4.2 Barton-Nackmann技巧 90
4.4.3 严格弱序 91
4.4.4 避免对象膨胀 93
4.4.5 运算符和各种类型 94
4.4.6 相等和等价之间的差别 95
4.4.7 算术类型 98
4.4.8 该使用运算符时再使用
运算符 99
4.4.9 理解Operators库的工作
机制 100
4.4.10 其他内容 102
4.5 Operators库小结 103
第5章 Regex库 104
5.1 Regex库如何改进程序 104
5.2 Regex库如何适用于标准库 104
5.3 Regex库 105
5.3.1 头文件 105
5.3.2 成员 105
5.3.3 自由函数 106
5.4 使用方法 107
5.4.1 输入验证 108
5.4.2 查找 110
5.4.3 替换 112
5.4.4 使用者常见的误解 113
5.4.5 关于重复和贪婪 113
5.4.6 regex_iterator简介 114
5.4.7 通过regex_token_iterator
分割字符串 116
5.4.8 更多的正则表达式 116
5.4.9 无效的正则表达式 117
5.5 Regex库小结 119
第Ⅱ部分 容器和数据结构
第6章 Any库 123
6.1 Any库如何改进程序 123
6.2 Any库如何适用于标准库 123
6.3 Any库 124
6.3.1 头文件 124
6.3.2 成员 124
6.3.3 自由函数 125
6.3.4 异常 126
6.4 使用方法 126
6.4.1 存储任意的类型 127
6.4.2 属性类 129
6.4.3 any类其他成员函数的用法 131
6.4.4 在any中存储指针 133
6.4.5 一个更好的办法—— 使用
智能指针shared_ptr 133
6.4.6 没有输入和输出运算符
的原因 137
6.4.7 通过any_out增加对输出
的支持 137
6.4.8 谓词 140
6.4.9 非空值计数 141
6.4.10 从容器中提取特定类型
的元素 141
6.4.11 使用谓词和提取器 142
6.4.12 适应标准库适配器的需求 144
6.5 Any库小结 146
第7章 Variant库 147
7.1 Variant库如何改进程序 147
7.2 Variant库如何适用于标准库 148
7.3 Variant库 148
7.3.1 头文件 148
7.3.2 成员 149
7.4 使用方法 150
7.4.1 访问Variant 152
7.4.2 泛型访问器 155
7.4.3 二元访问器 156
7.4.4 其他功能 158
7.5 Variant库小结 158
第8章 Tuple库 159
8.1 Tuple库如何改进程序 159
8.2 Tuple库如何适用于标准库 159
8.3 Tuple库 160
8.3.1 头文件 160
8.3.2 成员 161
8.3.3 自由函数 162
8.3.4 关系运算符 162
8.4 使用方法 163
8.4.1 元组的构造 163
8.4.2 访问tuple的元素 165
8.4.3 tuple的赋值和复制构造 166
8.4.4 tuple的比较 167
8.4.5 将tuple的元素绑定到变量 170
8.4.6 tuple的流操作 171
8.4.7 关于tuple的更多知识 172
8.4.8 tuple和for_each 175
8.5 Tuple库小结 178
第Ⅲ部分 函数对象和高阶编程
第9章 Bind库 181
9.1 Bind库如何改进程序 181
9.2 Bind库如何适用于标准库 182
9.3 Bind库 182
9.4 使用方法 183
9.4.1 调用成员函数 183
9.4.2 绑定的工作机制 186
9.4.3 占位符和参数的更多介绍 188
9.4.4 动态排序标准 190
9.4.5 函数组合:第Ⅰ部分 193
9.4.6 函数组合:第Ⅱ部分 195
9.4.7 在bind表达式中选择值语
义还是指针语义 195
9.4.8 虚函数同样可以绑定 197
9.4.9 绑定到成员变量 198
9.4.10 绑定还是不绑定 199
9.4.11 让绑定器处理状态 201
9.4.12 Boost.Bind和Boost
.Function之间的配合 203
9.5 Bind库小结 203
第10章 Lambda库 205
10.1 Lambda库如何改进程序 205
10.2 Lambda库如何适用于
标准库 206
10.3 Lambda库 206
10.4 使用方法 207
10.4.1 一个简单的开始 207
10.4.2 当运算符不够使用时
使用绑定 209
10.4.3 如果不喜欢_1、_2和
_3占位符,如何重命名
它们 212
10.4.4 常量和变量的命名 213
10.4.5 ptr_fun和mem_fun何去
何从 215
10.4.6 无需的算术
操作 217
10.4.7 编写可读的谓词 218
10.4.8 使函数对象适用于
Boost.Lambda库 221
10.4.9 lambda表达式中的
控制结构 224
10.4.10 lambda表达式中的转型 228
10.4.11 构造和析构 231
10.4.12 异常的抛出和捕获 235
10.5 Lambda库小结 238
第11章 Function库 239
11.1 Function库如何改进程序 239
11.2 Function库如何适用于
标准库 239
11.3 Function库 239
11.3.1 头文件 239
11.3.2 使用首选语法的声明 240
11.3.3 使用兼容语法的声明 240
11.3.4 成员 241
11.4 使用方法 242
11.4.1 回调的基础 243
11.4.2 类成员函数 246
11.4.3 带状态的函数对象 247
11.4.4 在Boost.Function中
使用Boost.Bind 250
11.4.5 在Boost.Function中使用
Boost.Lambda 255
11.4.6 代价的考虑 255
11.4.7 幕后的细节 256
11.5 Function库小结 259
第12章 Signals库 260
12.1 Signals库如何改进程序 260
12.2 Signals库如何适用于
标准库 260
12.3 Signals库 261
12.3.1 头文件 261
12.3.2 类型 262
12.3.3 成员 262
12.4 使用方法 263
12.4.1 插槽分组 264
12.4.2 带参数的signal 267
12.4.3 对结果进行组合 274
12.4.4 signal永远不能复制 277
12.4.5 管理连接 277
12.4.6 使用Bind和Lambda
创建插槽 280
12.5 Signals库小结 282
Boost是一套开放源代码的、高度可移植的C++库,其中大量的组件已经基本成熟并可供应用。在C++社区中将Boost称为“准标准库”,即相当于STL的延续和扩展,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化。不过与STL相比,Boost更加实用。STL集中在算法部分,而Boost包含了不少的工具类,可以完成比较具体的工作。
Boost是由C++标准委员会类库工作组成员发起的,致力于为C++开发新的类库,许多C++专家都投身于Boost的开发中。
在编程界流传着这样一个说法:要想成为高手,一定要多读高手编写的代码。哪些代码比较好呢?是C++标准库的源代码吗?不是,如果您读过这些代码,就会发现这些代码要么是各种实现独特的表达方式让人摸不着头脑,要么是恐怖的代码风格(例如到处是下划线)憋得让人难受。Boost库的代码则相当清晰、注释合理、命名规范,绝对是适合阅读的典范。同时,Boost库内容广泛,包括数值计算、泛型编程、元编程、智能指针、类型转换等众多内容,所以可以从中选择自己感兴趣的部分,细细品味。
本书是市面上第一本全面深入介绍Boost的著作,因此对于那些勇于探索的C++开发先锋来说,本书无疑是值得一读的。特别是Boost中已有一些库和特性为C++标准库技术报告所接受,成为C++标准库的内容,所以广大的编程爱好者阅读本书也会获益匪浅。
在阅读本书的过程中,读者需要注意本书的排版风格,作者在写作过程中,大量使用了函数名和关键字,例如,“删除”使用了函数名“delete”,“绑定”使用了函数名“bind”,“类型定义”使用了关键字“typedef”等等。因此在本书的翻译过程中,也尽量保持了原书的风格,读者可能刚开始不习惯,但是经过一段时间后,将会发现使用这种方式更容易理解代码。
感谢清华大学出版社为我们引进了这本优秀的图书,感谢清华大学出版社的编辑和相关人员的精心组织、认真指导、大力协助,使本书的翻译最终得以完成。
本书主要由张杰良翻译,在翻译过程中肖国尊做了不少协助工作。敬请广大读者提供反馈意见,读者可以将意见E-mail至wkservice@tup.tsinghua.edu.cn,我们会仔细查阅读者发来的每一封邮件,以求进一步提高今后译著的质量。
译 者
2006年10月
亲爱的读者:
欢迎您阅读本书。
如果您对泛型编程、库设计以及C++标准库感兴趣,那么本书就是为您准备的。因为本书所针对的读者是中高级C++程序员,所以本书中几乎没有涉及C++的基本概念。正如标题所暗示的那样,本书的重点是Boost库的常规用法、最佳实践、实现技术以及设计理念。
几乎从我发现Boost、Boost的开发者以及它所包含的那些非凡的库那天开始,我就想要写这本书。令人惊奇的是,像C++这样一门成熟的语言仍然能够为更高层次的抽象和技术细节提供探索空间,而所有这些都还不需要对语言进行任何修改。当然,这也正是C++与其他许多编程语言的区别所在:它是特意针对可扩展性进行设计的,而且语言本身对于泛型构造的支持也异常强大。Boost库和Boost社区本身所进行的正是这种探索。Boost的目的是为了使C++编程更加优雅、健壮和高效。Boost库已经取得了许多发现并且形成了许多最佳实践,现在C++社区面临一个重大的挑战:怎样与大家一起分享这些知识。孤立地看,这些重大的发现价值有限,但是当更多的人接受它们时,将会推动整个业界的发展。
本书展示了Boost库中一些最有用的库的使用方法,并且还讲授了它们用法的一些最佳实践,甚至还带领您走进幕后探询它们的工作机制。Boost库的许可证允许针对软件进行任何用途的(商业和非商业的)复制、使用和修改,所以大家所要做的事情就是访问www.boost.org网站,下载其最新版本即可。
所有C++标准库的狂热爱好者都知道,标准库正在进行新一轮的修订。从标准化的观点出发,C++标准库最有可能进行以下3个方面的修订:
● 修正有问题的库
● 增加一些现有库所欠缺的特性
● 添加新库以提供现有标准库所欠缺的功能
Boost库以不同的方式涵盖了上述3个方面。本书所覆盖的12个库中,有6个库已经为即将发布的C++库技术报告(Library Technical Report)所接受,这意味着它们很有可能成为下一版本的标准库的成员。因此,学习这些库具有长远的价值。希望大家能认为本书是一个很有用的工具,可以更好地帮助大家使用、理解和扩展Boost库。希望在本书的帮助下,大家可以把这些库以及它们所包含的思想整合到自己的设计和实现中。而这就是所谓的重用(reuse)。
谢谢阅读本书。
BjÖrn Karlsson
无封面