第1部分:基本概念 3
第1章 函数模板 3
1.1 初识函数模板 3
1.1.1 定义模板 3
1.1.2 使用模板 4
1.1.3 二阶段翻译 6
1.2 模板参数推导 7
1.3 多模板参数 9
1.3.1 返回类型的模板参数 10
1.3.2 推导返回类型 11
1.3.3 作为通用类型返回 12
1.4 缺省模板参数 13
1.5 重载函数模板 15
1.6 但是,难道我们不应该…? 20
1.6.1 按值传递还是按引用传递? 20
1.6.2 为什么不用inline呢? 20
1.6.3 为什么不用constexpr呢? 21
1.7 小结 21
2 第2章 类模板 23
2.1 类模板Stack的实现 23
2.1.1 类模板声明 24
2.1.2 成员函数的实现 26
2.2 类模板Stack的使用 27
2.3 类模板的局部使用 29
2.3.1 概念 29
2.4 友元 30
2.5 类模板特化 31
2.6 偏特化 33
2.7 缺省类模板参数 36
2.8 类型别名 38
2.9 类模板参数推导 40
2.10 模板聚合 43
2.11 小结 44
3 第3章 非类型模板参数 45
3.1 非类型类模板参数 45
3.2 非类型函数模板参数 48
3.3 非类型模板参数的限制 49
3.4 模板参数类型 50
3.5 小结 54
4 第4章 可变参数模板 55
4.1 变参数模板 55
4.1.1 可变参数模板实例 55
4.1.2 重载可变参数和非可变参数模板 57
4.1.3 算符sizeof 57
4.2 折叠表达式 58
4.3 可变参数模板的应用 60
4.4 可变参数类模板和可变参数表达式 61
4.4.1 可变参数表达式 62
4.4.2 可变参数指数 63
4.4.3 可变参数类模板 63
4.4.4 可变参数推导指南 64
4.4.5 可变参数基类和using 65
4.5 小结 66
5 第5章 基础技术 67
5. 关键字typename 67
5.2 零初始化 68
5.3 this->的使用 70
5.4 原始数组和字符串字面量模板 71
5.5 成员模板 74
5.5.1 构造.template 79
5.5.2 泛型Lambda与成员模板 80
5.6 变量模板 80
5.7 模板的模板参数 83
5.8 小结 89
6 第6章 移动语义与enable_if<> 91
6.1 完美转发 91
6.2 特殊的成员函数模板 95
6.3 使用enable_if<>禁用模板 98
6.4 使用enable_if<> 99
6.5 使用概念简化enable_if<>表达式 103
6.6 小结 104
7 第7章 按值传递还是按引用传递? 105
7.1 按值传递 106
7.2 按引用传递 108
7.2.1 按常量引用传递 108
7.2.2 按非常量引用传递 110
7.2.3 按转发传递 111
7.3 std::ref()和std::cref()的使用 112
7.4 处理字符串字面量常量与原始数组 115
7.4.1 字符串字面量常量和原始数组的特殊实现 116
7.5 处理返回值 117
7.6 模板参数声明推荐 118
7.7 小结 121
8 第8章 编译时编程 123
8.1 模板元编程 123
8.2 使用constexpr计算 125
8.3 局部特化的执行路径选择 127
8.4 SFINAE(替换失败并不是一种错误) 129
8.4.1 带有decltype的SFINAE表达式 133
8.5 编译时if 134
8.6 小结 135
9 第9章 在实战中使用模板 137
9.1 包含模型 137
9.1.1 接器错误 137
9.1.2 头文件中的模板 139
9.2 模板和inline 140
9.3 预编译头文件 141
9.4 破译大篇幅错误信息 143
9.5 本章后记 149
9.6 小结 150
10 第10章 基本模板术语 151
10.1 “类模板”还是“模板类”? 151
10.2 替换、实例化和特化 152
10.3 声明和定义 153
10.3.1 完全和不完全类型 154
10.4 一处定义规则 154
10.5 模板实数和模板形参 155
10.6 小结 156
11 第11章 泛型库 157
11.1 Callable 157
11.1.1 支持函数对象 158
11.1.2 处理成员函数和附加实参 160
11.1.3 包装函数调用 162
11.2 实现泛型库的其他实用程序 164
11.2.1 Type Traits 164
11.2.2 std::addressof() 166
11.2.3 std::declval() 166
11.3 完美转发临时对象 167
11.4 引用为模板参数 167
11.5 延迟评估 171
11.6 编写泛型库时需要考虑的事情 172
11.7 小结 173
第2部分 深入模板 175
12 第12章 深入模板基础 177
12.1 参数化宣告 177
12.1.1 虚成员函数 182
12.1.2 模板链接 182
12.1.3 主模板 184
12.2 模板形参 185
12.2.1 类型形参 185
12.2.2 类型形参 186
12.2.3 模板的模板形参 187
12.2.4 模板参数包 188
12.2.5 缺省模板实参. 190
12.3 模板实参 192
12.3.1 函数模板实参 192
12.3.2 类型实参 194
12.3.3 非类型实参 194
12.3.4 模板的模板实参 197
12.3.5 实参的等价性 199
12.4 可变参数模板 200
12.4.1 包扩展 201
12.4.2 在哪里进行包扩展? 202
12.4.3 函数的参数包 204
12.4.4 多重和嵌套包扩展 205
12.4.5 零长度包扩展 207
12.4.6 折叠表达式 207
12.5 友元 209
12.5.1 类模板的友元类. 209
12.5.2 类模板的友元函数 211
12.5.3 友元模板 213
12.6 本章后记 213
13 第13章 模板中的名称 215
13.1 名称的分类 215
13.2 名称的查找 217
13.2.1 参数依赖查找(ADL) 219
13.2.2 友元声明的ADL 220
13.2.3 注入式类名称 221
13.2.4 当前实例化 223
13.3 解析模板 224
13.3.1 非模板的上下文敏感性 225
13.3.2 类型的依赖名称 228
13.3.3 模板的依赖名称 230
13.3.4 使用声明中的依赖名称 231
13.3.5 ADL和显式模板实参 233
13.3.6 依赖表达式 233
13.3.7 编译器错误 236
13.4 继承和类模板 236
13.4.1 依赖型基类 236
13.4.2 依赖型基类 237
13.5 本章后记 240
14 第14章 实例化 243
14.1 按需实例化 243
14.2 延迟实例化 245
14.2.1 分和全部实例化 245
14.2.2 实例化组件 246
14.3 C++实例化模型 249
14.3.1 二阶段查找 249
14.3.2 实例化点 250
14.3.3 包含模型 254
14.4 实现方案 255
14.4.1 贪婪实例化 256
14.4.2 询问实例化 257
14.4.3 迭代实例化 259
14.5 显式实例化 260
14.5.1 手动实例化 260
14.5.2 式实例化声明 262
14.6 编译时if语句 263
14.7 在标准库中 265
14.8 本章后记 266
15 第15章 模板实参推导 269
15.1 推导过程 269
15.2 推导上下文 271
15.3 特殊的推导情况 273
15.4 初始化列表 274
15.5 形参包 275
15.5.1 字面运算符模板 277
15.6 右值引用 277
15.6.1 引用折叠原则 277
15.6.2 转发引用 278
15.6.3 完美转发 280
15.6.4 推导的惊喜 283
15.7 SFINAE(替换失败并不是错误) 284
15.7.1 即时上下文 285
15.8 推导的限制 286
15.8.1 可接受的实参转换 287
15.8.2 类模板实参 288
15.8.3 缺省调用实参 289
15.8.4 异常规范 290
15.9 显式函数模板实参 291
15.10 从初始化和表达式中推导 293
15.10.1 类型说明符 294
15.10.2 用decltype表示表达式的类型 298
15.10.3 decltype(auto) 301
15.10.4 auto推导的特殊情况 303
15.10.5 结构化绑定 306
15.10.6 型Lambda表达式 309
15.11 别名模板 312
15.12 类模板实参推导 313
15.12.1 推导指南 314
15.12.2 隐式推导指南 316
15.12.3 其他细节 318
15.13 本章后记 321
16 第16章 特化和重载 323
16.1 当“泛型代码”并不能很好地解决问题时 323
16.1.1 透明自定义 324
16.1.2 语义透明度 325
16.2 重载函数模板 326
16.2.1 签名 328
16.2.2 重载函数模板的偏序 330
16.2.3 正式的排序规则 331
16.2.4 模板和非模板 332
16.2.5 可变参数函数模板 335
16.3 显式特化 338
16.3.1 全局类模板特化 338
16.3.2 全局函数模板特化 342
16.3.3 全局可变模板特化 344
16.3.4 全局成员特化 344
16.4 局部类模板特化 347
16.5 局部可变模板特化 351
16.6 本章后记 352
17 第17章 未来发展方向 353
17.1 宽松的typename原则 354
17.2 广义非类型模板参数 354
17.3 函数模板的局部特化 356
17.4 命名模板实参 358
17.5 重载类模板 359
17.6 中间包扩展的推导 360
17.7 void的规范化 361
17.8 模板的类型检查 361
17.9 反射元编程 363
17.10 包管理工具 365
17.11 模块 366
第3部分 模板和设计 367
18 第18章 模板的多态性 369
18.1 动态多态性 369
18.2 静态多态性 372
18.3 动态多态性与静态多态性 375
18.4 概念 377
18.5 设计模式的新形式 379
18.6 泛型编程 380
18.7 本章后记 383
19 第19章 Trait的实现 385
19.1 一个实例:累加一个序列 385
19.1.1 Fixed Trait 386
19.1.2 Value Trait 389
19.1.3 参数化Trait 394
19.2 Trait、Policy和Policy类 394
19.2.1 Trait和Policy:区别在哪里? 397
19.2.2 成员模板与模板的模板参数 398
19.2.3 组合多个policy和/或trait 399
19.2.4 用一般迭代器累积 399
19.3 类型函数 401
19.3.1 元素类型 401
19.3.2 转换特点 404
19.3.3 谓词特点 410
19.3.4 Result Type Traits 413
19.4 基于SFINAE的Trait 416
19.4.1 SFINAE功能过载 416
19.4.2 SFINAE局部特化 420
19.4.3 为SFINAE使用泛型Lambda表达式 421
19.4.4 SFINAE友好的特征 424
19.5 IsConvertibleT 428
19.6 检查成员 431
19.6.1 检查成员类型 431
19.6.2 检查任意成员类型 433
19.6.3 检查非类型成员 434
19.6.4 使用泛型Lambda表达式检查成员 438
19.7 其他Trait技术 440
19.7.1 If-Then-Else 440
19.7.2 检查不抛出异常的操作 443
19.7.3 Trait的便利性 446
19.8 类型分类 448
19.8.1 确定基本类型 448
19.8.2 确定复合类型 451
19.8.3 识别函数类型 454
19.8.4 确定类类型 456
19.8.5 确定枚举类型 457
19.9 Policy Traits 458
19.9.1 只读参数类型. 458
19.10 在标准库中 461
19.11 本章后记 462
20 第20章 类型属性上的重载 465
20.1 算法特化 465
20.2 标签调度 467
20.3 启用/禁用函数模板 469
20.3.1 提供多重特化 471
20.3.2 EnableIf在哪里运行? 472
20.3.3 编译时if 474
20.3.4 概念 475
20.4 类的特化 477
20.4.1 启用/禁用类模板 477
20.4.2 类模板标签调度 479
20.5 实例化安全的模板 482
20.6 在标准库中 487
20.7 本章后记 488
21 第21章 模板和继承 489
21.1 空白基类最优化 489
21.1.1 布局原则 490
21.1.2 成员作为基类 492
21.2 奇异递归模板模式 495
21.2.1 Barton-Nackman技巧 497
21.2.2 操作符实现 500
21.2.3 门面模式 501
21.3 Mixin 508
21.3.1 令人好奇的Mixin 510
21.3.2 参数化的虚拟性 510
21.4 指定模板参数 512
21.5 本章后记 515
22 第22章 桥接静态和动态多态性 517
22.1 函数对象、指针和std::function<> 517
22.2 广义函数指针 519
22.3 桥接口 522
22.4 类型擦除 523
22.5 可选桥接 525
22.6 性能考虑 527
22.7 本章后记 528
23 第23章 元编程 529
23.1 现代C++元编程的状态 529
23.1.1 取值元编程 529
23.1.2 类型元编程 531
23.1.3 合元编程 532
23.1.4 单元类型的混合元编程 534
23.2 反射元编程的维数 537
23.3 递归实例化的代价 539
23.3.1 跟踪所有实例 540
23.4 计算完整性 542
23.5 递归实例化与递归模板参数 542
23.6 枚举值与静态常量 543
23.7 本章后记 545
24 第24章 Typelist 549
24.1 Typelist解析 549
24.2 Typelist算法 551
24.2.1 索引 551
24.2.2 寻找最佳匹配 552
24.2.3 添加Typelist 555
24.2.4 反转Typelist 557
24.2.5 转化Typelist 559
24.2.6 累加Typelist 560
24.2.7 插入排序 563
24.3 非类型Typelist 566
24.3.1 推导的非类型参数 568
24.4 使用包扩展优化算法 569
24.5 Cons-style Typelist 571
24.6 本章后记 573
25 第25章 元组 575
25.1 基本的元组设计 576
25.1.1 存储 576
25.1.2 结构 578
25.2 基本的元组操作 579
25.2.1 比较 579
25.2.2 输出 580
25.3 元组算法 581
25.3.1 元组作为Typelist 581
25.3.2 从元组中添加和移除 582
25.3.3 反转一个元组 584
25.3.4 索引列表 585
25.3.5 用索引列表进行反转 586
25.3.6 洗牌算法和选择算法 588
25.4 扩展元组 592
25.5 优化元组 593
25.5.1 元组和EBCO 593
25.5.2 常数时间的get() 598
25.6 元组下标 599
25.7 本章后记 601
26 第26章 可识别的联合 603
26.1 存储 604
26.2 设计 606
26.3 值查询与提取 610
26.4 元素初始化、赋值和销毁 611
26.4.1 初始化 611
26.4.2 销毁 612
26.4.3 赋值 613
26.5 访问 617
26.5.1 访问结果类型 621
26.5.2 常见结果类型 622
26.6 变量初始化赋值 624
26.7 本章后记 628
27 第27章 表达式模板 629
27.1 临时变量和分割循环 630
27.2 在模板参数中编码表达式 635
27.2.1 表达式模板的操作数 636
27.2.2 Array类型 639
27.2.3 运算符 642
27.2.4 回顾 643
27.2.5 表达式模板赋值 645
27.3 表达式模板的性能与约束 646
27.4 本章后记 647
28 第28章 调试模板 651
28.1 浅式实例化 652
28.2 静态断言 654
28.3 原型 655
28.4 跟踪程序 657
28.5 Oracle 662
28.6 本章后记 662
附录 663
A 附录A一处定义原则 663
A.1 翻译单元 663
A.2 声明和定义 664
A.3 一处定义原则的细节 665
A.3.1 程序的一处定义约束 665
A.3.2 翻译单元的一处定义约束 667
A.3.3 跨翻译单元的等价性约束 669
B 附录B 值类别 673
B.1 传统的左值和右值 673
B.1.1 左值和右值转换 674
B.2 C++11的值类别 674
B.2.1 临时实体化 676
B.3 使用decltype检查值类别 678
B.4 引用类别 679
C 附录C重载解析 681
C.1 何时应用重载解析? 681
C.2 简化的重载解析 682
C.2.1 成员函数的隐式参数 684
C.2.2 对最佳匹配进行改进 686
C.3 重载的细节 688
C.3.1 优先非模板还是更加专用的模板 688
C.3.2 转义序列 689
C.3.3 指针转换 689
C.3.4 初始化列表 691
C.3.5 仿函数和代理函数 694
C.3.6 其他重载情况 695
D 附录D 标准类型实用程序 697
D.1 使用Type Traits 697
D.1.1 std::integral_constant和std::bool_constant 698
D.1.2 使用Trait时应该知道的事 700
D.2 主要类型和复合类型 702
D.2.1 测试主要类型的类别 702
D.2.2 测试复合类型的类别 706
D.3 类型属性和操作 709
D.3.1 其他类型属性 709
D.3.2 测试具体操作 718
D.3.3 类型之间的关系 725
D.4 类型结构 728
D.5 其他Trait 732
D.6 组合Type Trait 734
D.7 其他应用程序 737
E 附录E概念 739
E.1 使用概念 739
E.2 定义概念 742
E.3 重载约束 743
E.3.1 约束包含 744
E.3.2 约束和标签调度 745
E.4 概念提示 746
E.4.1 测试概念 746
E.4.2 概念粒度 746
E.4.3 二进制兼容性 747
文献目录 749
论坛 749
图书和网站 750
术语 759
索引 771