图书目录

目    录

第Ⅰ部分 模板的核心概念

第1章  模板的简介  3

1.1 理解模板的必要性  3

1.2 编写你的第一个模板  6

1.3  理解模板术语  9

1.4  模板的简史  10

1.5  模板的优缺点  12

1.6  总结  12

1.7  问题  13

第2章  模板的基础  15

2.1  定义函数模板  15

2.2  定义类模板  18

2.3  定义成员函数模板  20

2.4  理解模板形参  21

2.4.1  类型模板形参  22

2.4.2  非类型模板形参  23

2.4.3  模板模板形参  28

2.4.4   默认模板实参  30

2.5  理解模板实例化  32

2.5.1  隐式实例化  32

2.5.2  显式实例化  35

2.6  理解模板特化  39

2.6.1  显式特化  39

2.6.2  部分特化  43

2.7  定义变量模板  46

2.8  定义别名模板  49

2.9  探索泛型lambda和lambda模板  51

2.10  总结  57

2.11  问题  57

第3章  变参模板  59

3.1  理解变参模板的必要性  59

3.2  变参函数模板  61

3.3  形参包  65

3.4  变参类模板  73

3.5  折叠表达式  79

3.6  变参别名模板  82

3.7  变参变量模板  84

3.8  总结  84

3.9  问题  85

第Ⅱ部分  高级模板特性

第4章  高级模板的概念  89

4. 1  理解名称绑定和依赖名称  89

4.1.1  两阶段名称查找  91

4.1.2  依赖类型名称  94

4.1.3  依赖模板名称  96

4.1.4  当前实例化  97

4.2  探索模板递归  99

4.3  函数模板实参推导  103

4.4  类模板实参推导  112

4.5  转发引用  117

4.6  decltype说明符  123

4.7  std::declval类型运算符  128

4.8  理解模板中的友元关系  130

4.9  总结  135

4.10  问题  135

第5章  类型特征和条件编译  137

5.1  理解和定义类型特征  137

5.2  探索SFINAE及其目的  141

5.3  使用enable_if类型特征启用SFINAE  145

5.4  使用 constexpr if  149

5.5  探索标准库类型特征  152

5.5.1 查询类型类别  152

5.5.2 查询类型属性  155

5.5.3 查询支持的操作  157

5.5.4 查询类型之间的关系  158

5.5.5 修改const/volatile说明符、引用、指针或符号  159

5.5.6  各种转换  160

5.6  使用类型特征的实际例子  163

5.6.1  实现拷贝算法  163

5.6.2  构建同质的变参函数模板  166

5.7  总结  167

5.8  问题  168

第6章  概念和约束  169

6.1  理解概念的必要性  169

6.2  定义概念  174

6.3  探索requires表达式  176

6.3.1  简单要求  177

6.3.2  类型要求  179

6.3.3  复合要求  180

6.3.4  嵌套要求  182

6.4  组合约束  183

6.5  了解带约束模板的顺序  187

6.6  约束非模板成员函数  190

6.7  约束类模板  193

6.8  约束变量模板和模板别名  194

6.9  学习更多指定约束的方法  195

6.10  使用概念约束auto形参  196

6.11  探索标准概念库  198

6.12  总结  202

6.13  问题  202

第Ⅲ部分  模板的应用

第7章 模式和惯用法  205

7.1  动态多态和静态多态  205

7.2  奇异递归模板模式  208

7.2.1  使用CRTP限制对象实例化的次数  210

7.2.2  使用CRTP添加功能  211

7.2.3  实现组合设计模式  213

7.2.4  标准库中的CRTP  217

7.3  混入  220

7.4  类型擦除  225

7.5  标签派发  231

7.6  表达式模板  236

7.7  类型列表  243

7.7.1  使用类型列表  245

7.7.2  实现对类型列表的操作  247

7.8  总结  253

7.9  问题  254

第8章 范围和算法  255

8.1  理解容器、迭代器和算法的设计  255

8.2  创建自定义容器和迭代器  262

8.2.1  实现环形区缓冲容器  263

8.2.2  为环形缓冲区容器实现迭代器类型  269

8.3  编写自定义通用算法  275

8.4  总结  277

8.5  问题  278

第9章 范围库  279

9.1  从抽象范围到范围库  279

9.2  理解范围概念和视图  281

9.3  理解受约束算法  291

9.4  编写自己的范围适配器  294

9.5 总结  300

9.6 问题  300

附录A 结束语  301

——以下内容可扫描封底二维码下载——

问题答案  303

参考文献  313