第0章 导读 1
0.1 关于本书 1
0.2 读者对象 2
0.3 本书的风格 3
0.4 本书的开发环境 3
0.5 本书的结构 4
0.6 如何阅读本书 5
第1章 模板元编程(Ⅰ) 7
1.1 模板元编程概述 7
1.1.1 元数据 8
1.1.2 元函数 9
1.1.3 元函数转发 10
1.1.4 方便的工具 11
1.1.5 应用示例 12
1.2 type_traits 14
1.2.1 概述 14
1.2.2 元数据类别(Ⅰ) 15
1.2.3 元数据类别(Ⅱ) 17
1.2.4 元数据属性 18
1.2.5 元数据之间的关系 20
1.2.6 元数据转换 21
1.2.7 解析函数元数据 25
1.2.8 实现原理 26
1.2.9 应用示例 28
1.3 总结 29
第2章 实用工具 31
2.1 compressed_pair 31
2.1.1 什么是空类 31
2.1.2 类摘要 33
2.1.3 构造与赋值 34
2.1.4 用法 35
2.1.5 实现原理 36
2.1.6 功能扩展 37
2.2 checked_delete 40
2.2.1 函数的用法 41
2.2.2 函数对象的用法 42
2.2.3 带检查的删除 44
2.2.4 实现原理 45
2.2.5 使用建议 47
2.3 addressof 47
2.3.1 用法 47
2.3.2 实现原理 49
2.3.3 使用建议 49
2.4 value_initialized 50
2.4.1 变量的初始化 50
2.4.2 initialized<T> 51
2.4.3 用法 52
2.4.4 value_initialized<T> 52
2.4.5 更方便的用法 53
2.5 base_from_member 54
2.5.1 类摘要 54
2.5.2 用法 55
2.5.3 进一步的用法 57
2.6 conversion 59
2.6.1 标准转型操作符 59
2.6.2 多态对象的转型 60
2.6.3 polymorphic_downcast 61
2.6.4 polymorphic_cast 62
2.6.5 使用模板元编程实现转型 63
2.7 numeric/conversion 66
2.8 pointer 67
2.8.1 pointee 67
2.8.2 indirect_reference 69
2.8.3 pointer_to_other 69
2.8.4 compare_pointees 70
2.9 scope_exit 72
2.9.1 用法 72
2.9.2 应用示例 73
2.9.3 实现原理 74
2.9.4 注意事项 75
2.10 总结 76
第3章 迭代器 79
3.1 迭代器概述 79
3.1.1 迭代器模式 79
3.1.2 标准迭代器 80
3.1.3 新式迭代器 81
3.1.4 标准迭代器工具 83
3.1.5 迭代器与算法 84
3.2 next_prior 84
3.2.1 函数声明 85
3.2.2 用法 85
3.3 iterator_traits 87
3.3.1 标准迭代器特征类 87
3.3.2 类摘要 88
3.3.3 用法 89
3.4 iterator_facade 89
3.4.1 迭代器的核心操作 90
3.4.2 类摘要 90
3.4.3 用法 92
3.5 iterator_adaptor 96
3.5.1 类摘要 96
3.5.2 用法 98
3.6 迭代器工具 99
3.6.1 共享容器迭代器 99
3.6.2 发生器迭代器 102
3.6.3 逆向迭代器 104
3.6.4 间接迭代器 105
3.6.5 计数迭代器 107
3.6.6 函数输入迭代器 110
3.6.7 函数输出迭代器 113
3.6.8 过滤迭代器 115
3.6.9 转换迭代器 118
3.6.10 索引迭代器 119
3.6.11 组合迭代器 121
3.7 总结 124
第4章 函数对象 127
4.1 hash 127
4.1.1 类摘要 128
4.1.2 用法 129
4.1.3 实现原理 130
4.1.4 扩展hash 131
4.2 mem_fn 134
4.2.1 工作原理 134
4.2.2 用法 134
4.2.3 其他议题 136
4.3 factory 137
4.3.1 类摘要 138
4.3.2 用法 138
4.3.3 value_factory 141
4.3.4 使用typeof库 141
4.4 forward 142
4.4.1 类摘要 142
4.4.2 用法 143
4.5 总结 145
第5章 指针容器 147
5.1 概述 147
5.1.1 入门示例 148
5.1.2 指针容器的优缺点 151
5.1.3 可克隆概念 152
5.1.4 克隆分配器 153
5.1.5 指针容器的分类 154
5.2 指针容器的共通能力 157
5.2.1 模板参数 157
5.2.2 构造与赋值 159
5.2.3 访问元素 160
5.2.4 其他能力 162
5.3 序列指针容器适配器 163
5.3.1 配置元函数 163
5.3.2 类摘要 164
5.3.3 接口解说 166
5.3.4 代码示例 166
5.4 ptr_vector 167
5.4.1 类摘要 168
5.4.2 用法 169
5.5 ptr_deque 170
5.5.1 类摘要 170
5.5.2 用法 171
5.6 ptr_list 172
5.6.1 类摘要 172
5.6.2 用法 173
5.7 ptr_array 174
5.7.1 类摘要 174
5.7.2 用法 175
5.8 ptr_circular_buffer 177
5.8.1 类摘要 177
5.8.2 用法 178
5.9 空指针处理 179
5.9.1 禁用空指针 179
5.9.2 允许空指针 179
5.9.3 使用空指针 181
5.9.4 空对象模式 182
5.10 关联指针容器的共通能力 184
5.10.1 类摘要 184
5.10.2 接口解说 185
5.11 集合指针容器适配器 186
5.11.1 配置元函数 186
5.11.2 ptr_set_adapter 187
5.11.3 ptr_multiset_adapter 188
5.12 ptr_set和ptr_multiset 189
5.12.1 类摘要 189
5.12.2 用法 190
5.13 ptr_unordered_set和ptr_unordered_multiset 191
5.13.1 类摘要 191
5.13.2 用法 193
5.14 映射指针容器适配器 194
5.14.1 配置元函数 194
5.14.2 ptr_map_adapter 195
5.14.3 ptr_multimap_adapter 197
5.15 ptr_map和ptr_multimap 198
5.15.1 类摘要 198
5.15.2 用法 199
5.16 ptr_unordered_map和ptr_unordered_multimap 200
5.16.1 类摘要 200
5.16.2 用法 202
5.17 使用assign库 203
5.17.1 向容器添加元素 203
5.17.2 初始化容器元素 204
5.18 使用算法 205
5.18.1 标准算法 205
5.18.2 序列指针容器的算法 209
5.18.3 关联指针容器的算法 212
5.19 其他议题 214
5.19.1 异常 214
5.19.2 间接函数对象 215
5.19.3 插入迭代器 216
5.19.4 使用视图分配器 217
5.19.5 可克隆性的再讨论 218
5.19.6 序列化 219
5.20 总结 219
第6章 侵入式容器 221
6.1 概述 221
6.1.1 手工实现链表 222
6.1.2 intrusive库介绍 223
6.2 入门示例 224
6.2.1 使用基类挂钩 224
6.2.2 使用成员挂钩 225
6.3 基本概念 227
6.3.1 节点 228
6.3.2 节点特征 228
6.3.3 节点算法 229
6.3.4 值特征 230
6.3.5 挂钩 231
6.3.6 选项 232
6.3.7 处置器 234
6.3.8 克隆 234
6.4 链表 235
6.4.1 节点和算法 235
6.4.2 基类挂钩 236
6.4.3 成员挂钩 237
6.4.4 list类摘要 238
6.4.5 list的基本用法 240
6.4.6 list的特有用法 242
6.5 有序集合 246
6.5.1 节点和算法 246
6.5.2 基类挂钩 247
6.5.3 成员挂钩 248
6.5.4 set类摘要 248
6.5.5 set的基本用法 250
6.5.6 set的特有用法 251
6.5.7 multiset类摘要 253
6.5.8 multiset的用法 254
6.6 无序集合 254
6.6.1 节点和算法 255
6.6.2 基类挂钩 255
6.6.3 成员挂钩 256
6.6.4 unordered_set类摘要 257
6.6.5 unordered_set的基本用法 258
6.6.6 unordered_set的特有用法 260
6.6.7 unordered_multiset类摘要 263
6.6.8 unordered_multiset的用法 263
6.7 其他议题 264
6.7.1 同时使用多个挂钩 264
6.7.2 链接模式 266
6.7.3 万能挂钩 266
6.8 总结 267
第7章 多索引容器 269
7.1 概述 269
7.2 入门示例 270
7.2.1 简单的例子 270
7.2.2 复杂的例子 271
7.2.3 更复杂的例子 273
7.3 基本概念 276
7.3.1 索引 276
7.3.2 索引说明 277
7.3.3 键提取器 278
7.3.4 索引说明列表 279
7.3.5 索引标签 279
7.3.6 多索引容器 280
7.4 键提取器 281
7.4.1 定义 281
7.4.2 identity 282
7.4.3 member 283
7.4.4 const_mem_fun 284
7.4.5 mem_fun 286
7.4.6 global_fun 287
7.4.7 自定义键提取器 287
7.5 序列索引 288
7.5.1 索引说明 288
7.5.2 类摘要 289
7.5.3 用法 290
7.6 随机访问索引 292
7.6.1 索引说明 292
7.6.2 类摘要 292
7.6.3 用法 293
7.7 有序索引 294
7.7.1 索引说明 295
7.7.2 类摘要 295
7.7.3 基本用法 297
7.7.4 高级用法 298
7.8 散列索引 301
7.8.1 索引说明 302
7.8.2 类摘要 302
7.8.3 用法 303
7.9 修改元素 305
7.9.1 替换元素 305
7.9.2 修改元素 306
7.9.3 修改键 309
7.10 多索引容器 310
7.10.1 类摘要 310
7.10.2 用法 311
7.11 组合索引键 314
7.11.1 类摘要 314
7.11.2 用法 315
7.11.3 辅助工具 316
7.12 总结 318
第8章 流处理 319
8.1 概述 319
8.1.1 标准库的流处理 319
8.1.2 Boost的流处理 321
8.2 入门示例 322
8.2.1 示例1 322
8.2.2 示例2 324
8.3 设备的特征 325
8.3.1 设备的字符类型 325
8.3.2 设备的模式 326
8.3.3 设备的分类 328
8.4 设备 329
8.4.1 设备概述 329
8.4.2 数组设备 330
8.4.3 标准容器设备 332
8.4.4 文件设备 334
8.4.5 空设备 335
8.5 过滤器 336
8.5.1 过滤器概述 337
8.5.2 管道和设备链 337
8.5.3 计数过滤器 339
8.5.4 正则表达式过滤器(Ⅰ) 341
8.5.5 正则表达式过滤器(Ⅱ) 344
8.5.6 压缩过滤器 345
8.6 流 348
8.6.1 基本流 348
8.6.2 过滤流 349
8.7 流处理函数 352
8.8 定制设备 353
8.8.1 定制源设备 354
8.8.2 定制接收设备 356
8.9 定制过滤器 357
8.9.1 过滤器实现原理 357
8.9.2 aggregate_filter 358
8.9.3 basic_line_filter 360
8.9.4 手工打造过滤器 361
8.10 组合设备 365
8.10.1 combine 365
8.10.2 compose 366
8.10.3 tee 367
8.11 其他议题 369
8.12 总结 370
第9章 序列化 373
9.1 编译与使用 373
9.1.1 编译 373
9.1.2 使用 376
9.2 入门示例 376
9.2.1 示例1 376
9.2.2 示例2 378
9.2.3 示例3 379
9.3 基本概念 381
9.3.1 存档(archive) 381
9.3.2 可序列化 382
9.3.3 序列化和反序列化 383
9.4 存档 383
9.4.1 输出存档 383
9.4.2 输入存档 385
9.4.3 类继承体系 386
9.4.4 XML格式存档 387
9.4.5 异常 388
9.5 使用序列化 389
9.5.1 基本类型的序列化 389
9.5.2 数组的序列化 390
9.5.3 标准类型的序列化 392
9.5.4 标准容器的序列化 393
9.5.5 非标准容器的序列化 394
9.5.6 Boost类型的序列化 395
9.5.7 Boost容器的序列化 397
9.6 定制序列化 399
9.6.1 可序列化的要求 399
9.6.2 侵入式可序列化 402
9.6.3 非侵入式可序列化 403
9.6.4 Boost类型的可序列化 404
9.6.5 Boost容器的可序列化 407
9.7 高级定制序列化 410
9.7.1 派生类的序列化 410
9.7.2 序列化的版本 411
9.8 指针的序列化 413
9.8.1 指针可序列化的要求 413
9.8.2 原始指针的序列化 414
9.8.3 智能指针的序列化 414
9.8.4 派生类指针的序列化 415
9.8.5 指针容器的序列化 417
9.9 实用工具 417
9.9.1 BOOST_STRONG_TYPEDEF 417
9.9.2 BOOST_STATIC_WARNING 418
9.9.3 smart_cast 418
9.9.4 base64编解码 419
9.9.5 base16编解码 422
9.10 总结 424
第10章 泛型编程 427
10.1 enable_if 427
10.1.1 类摘要 428
10.1.2 应用于模板函数 429
10.1.3 应用于模板类 430
10.1.4 lazy_enable_if 431
10.2 call_traits 431
10.2.1 类摘要 432
10.2.2 用法 432
10.2.3 实现原理 434
10.3 concept_check 436
10.3.1 概述 436
10.3.2 基本概念检查 437
10.3.3 函数对象概念检查 438
10.3.4 标准迭代器概念检查 439
10.3.5 新式迭代器概念检查 440
10.3.6 容器概念检查 442
10.3.7 在函数声明中的概念检查 444
10.3.8 概念原型类 445
10.4 function_types 446
10.4.1 属性标签 447
10.4.2 函数类型分类 448
10.4.3 函数类型分解 449
10.4.4 函数类型合成 451
10.4.5 其他议题 452
10.5 总结 452
第11章 模板元编程(Ⅱ) 455
11.1 mpl概述 455
11.2 mpl的整数类型 456
11.2.1 概述 456
11.2.2 整数类型 458
11.2.3 bool类型 459
11.2.4 基本运算 460
11.3 mpl的流程控制 464
11.3.1 if_和if_c 464
11.3.2 eval_if和eval_if_c 465
11.4 mpl的容器 467
11.4.1 概述 467
11.4.2 vector 468
11.4.3 string 469
11.4.4 map 471
11.4.5 相关元函数 472
11.5 mpl的迭代器 473
11.5.1 概述 473
11.5.2 相关元函数 474
11.6 mpl的算法 475
11.6.1 插入器 475
11.6.2 查询算法 476
11.6.3 变换算法 478
11.6.4 运行时算法 479
11.7 mpl的高级用法 481
11.7.1 高阶元数据 481
11.7.2 占位符 482
11.7.3 bind表达式 483
11.7.4 lambda表达式 484
11.7.5 算法的高级应用 485
11.8 mpl的调试 488
11.8.1 断言 488
11.8.2 打印输出 491
11.9 mpl实例研究 492
11.9.1 泛型编程版本 493
11.9.2 元编程第1版 495
11.9.3 元编程第2版 497
11.10 总结 499
第12章 开发实践 501
12.1 基本工具 501
12.1.1 标准整数 502
12.1.2 并发 503
12.1.3 日志 506
12.2 第一个TCP服务器 507
12.2.1 tcp_buffer 508
12.2.2 tcp_server 510
12.2.3 tcp_session 514
12.2.4 验证 519
12.2.5 使用回调函数 520
12.2.6 简单协议的实现 523
12.2.7 HTTP协议的实现 529
12.3 多线程工具 532
12.3.1 job_queue 532
12.3.2 worker 535
12.3.3 scheduler 539
12.3.4 safe_map 541
12.3.5 safe_singleton 546
12.4 第二个TCP服务器 547
12.4.1 消息结构定义 548
12.4.2 tcp_message 549
12.4.3 tcp_session 552
12.4.4 tcp_server 558
12.4.5 实现echo协议 560
12.4.6 实现聊天室 562
12.5 总结 571
第13章 Effective Boost 573
13.1 基本原则 573
13.2 内存管理 577
13.3 容器、迭代器和算法 578
13.4 其他 580
13.5 结束语 582
附录A 推荐书目 583
附录B Boost程序库组件索引 585
附录C 程序员的工具箱 597