1.详细分析代码示例
本书通过丰富的带有注释的代码示例,覆盖C++11、C++14、C++17的语言特性,并描述了其内部工作原理。无论是初学者还是专业程序员,都能了解到本书所具有的宝贵价值。
2.科学合理的内容安排
3位经验丰富的C++开发人员将展示为什么、何时以及如何使用现代模板来构建更简洁、更快速、更有效、更易于维护的软件。
3.读者轻松愉快地学习
通过丰富的提示、注意等板块设计让读者轻松愉快地学会C++模板。
4.下载代码示例
本书提供可下载的代码示例,方便读者亲手实践。
第 一部分 基础知识
第 1章 函数模板 2
1.1 函数模板初探 2
1.1.1 定义模板 2
1.1.2 使用模板 3
1.1.3 两阶段编译 4
1.2 模板实参推导简介 5
1.3 多模板参数 7
1.3.1 返回类型的模板参数 7
1.3.2 推导返回类型 8
1.3.3 返回类型为公共类型 9
1.4 默认模板实参简介 10
1.5 重载函数模板简介 11
1.6 难道,我们不应该…… 16
1.6.1 传值还是传引用 16
1.6.2 为什么不使用inline 16
1.6.3 为什么不使用constexpr 16
1.7 小结 17
第 2章 类模板 18
2.1 类模板Stack的实现 18
2.1.1 类模板的声明 19
2.1.2 成员函数的实现 20
2.2 类模板Stack的使用 21
2.3 部分使用类模板 22
2.4 友元简介 24
2.5 类模板的特化 25
2.6 偏特化 26
2.7 默认类模板实参 28
2.8 类型别名 30
2.9 类模板实参推导 32
2.10 模板化聚合体 35
2.11 小结 35
第3章 非类型模板参数 36
3.1 非类型的类模板参数 36
3.2 非类型的函数模板参数 38
3.3 非类型模板参数的限制 39
3.4 模板参数类型auto 40
3.5 小结 43
第4章 变参模板 44
4.1 变参模板简介 44
4.1.1 变参模板示例 44
4.1.2 变参和非变参模板的重载 45
4.1.3 sizeof...运算符 46
4.2 折叠表达式 46
4.3 变参模板应用 48
4.4 变参类模板和变参表达式 49
4.4.1 变参表达式 49
4.4.2 变参索引 50
4.4.3 变参类模板 51
4.4.4 变参推导指引 52
4.4.5 变参基类和using关键字 52
4.5 小结 54
第5章 基本技巧 55
5.1 关键字typename 55
5.2 零初始化 56
5.3 使用this-> 58
5.4 处理原始数组和字符串字面量的模板 58
5.5 成员模板 60
5.5.1 .template构造 65
5.5.2 泛型lambda和成员模板 65
5.6 变量模板 66
5.7 模板的模板参数简介 68
5.8 小结 73
第6章 移动语义和enable_if<> 74
6.1 完美转发简介 74
6.2 特殊成员函数模板 77
6.3 通过std::enable_if<>禁用 模板 79
6.4 使用enable_if<> 81
6.5 使用概念简化enable_if<> 表达式 84
6.6 小结 85
第7章 传值还是传引用 86
7.1 传值 86
7.2 传引用 88
7.2.1 传递常量引用 88
7.2.2 传递非常量引用 90
7.2.3 传递转发引用 91
7.3 使用std::ref()和std::cref() 92
7.4 处理字符串字面量和原始 数组 94
7.5 处理返回值 95
7.6 推荐的模板参数声明方法 97
7.7 小结 99
第8章 编译期编程 100
8.1 模板元编程 100
8.2 使用constexpr计算 102
8.3 偏特化的执行路径选择 103
8.4 SFINAE 104
8.5 编译期if简介 108
8.6 小结 110
第9章 在实践中使用模板 111
9.1 包含模型简介 111
9.1.1 链接器错误 111
9.1.2 头文件中的模板 112
9.2 模板和inline 113
9.3 预编译头文件 114
9.4 破译大篇错误信息 115
9.5 后记 122
9.6 小结 122
第 10章 模板基本术语 123
10.1 是“类模板”还是 “模板类” 123
10.2 替换、实例化和特化 123
10.3 声明和定义 124
10.4 单一定义规则 126
10.5 模板实参和模板形参 126
10.6 小结 127
第 11章 泛型库 128
11.1 可调用对象 128
11.2 实现泛型库的其他工具 133
11.3 完美转发临时变量 136
11.4 作为模板参数的引用 137
11.5 推迟估算 140
11.6 关于泛型库的思考 141
11.7 小结 141
第二部分 深入模板
第 12章 深入模板基础 144
12.1 参数化的声明 144
12.2 模板参数 150
12.3 模板实参 156
12.4 变参模板 163
12.5 友元 170
12.6 后记 174
第 13章 模板中的名称 175
13.1 名称的分类 175
13.2 名称查找 177
13.3 解析模板 183
13.4 继承和类模板 193
13.5 后记 196
第 14章 实例化 198
14.1 按需实例化 198
14.2 延迟实例化 200
14.3 C++的实例化模型 203
14.4 实现方案 207
14.5 显式实例化 212
14.6 编译期的if语句 215
14.7 标准库 216
14.8 后记 217
第 15章 模板实参推导 218
15.1 推导的过程 218
15.2 推导的上下文 220
15.3 特殊的推导情况 221
15.4 初始化列表 222
15.5 参数包 223
15.6 右值引用 225
15.7 SFINAE 230
15.8 推导的限制 233
15.9 显式函数模板参数 236
15.10 基于初始化器和表达式的 推导 238
15.11 别名模板 254
15.12 类模板参数推导 255
15.13 后记 262
第 16章 特化与重载 264
16.1 当“泛型代码”不是特别适用的时候 264
16.2 重载函数模板 267
16.3 显式特化 276
16.4 类模板偏特化 284
16.5 变量模板偏特化 287
16.6 后记 287
第 17章 未来方向 289
17.1 宽松的typename规则 289
17.2 广义非类型模板参数 290
17.3 函数模板的偏特化 292
17.4 命名模板实参简介 293
17.5 重载类模板 294
17.6 中间包扩展的演绎 294
17.7 void的规则化 295
17.8 模板的类型检查 296
17.9 反射元编程 297
17.10 包管理工具 298
17.11 模块 299
第三部分 模板与设计
第 18章 模板的多态 302
18.1 动多态 302
18.2 静多态 304
18.3 动多态与静多态 306
18.4 使用概念 308
18.5 新形式的设计模式 309
18.6 泛型程序设计 310
18.7 后记 312
第 19章 特征的实现 314
19.1 一个实例:累加一个序列 314
19.1.1 固定特征 314
19.1.2 值特征 317
19.1.3 参数化特征 321
19.2 特征、policy及policy类 321
19.3 类型函数 326
19.4 基于SFINAE的特征 339
19.5 IsConvertibleT 349
19.6 检测成员 351
19.7 其他特征技术 359
19.8 类型分类 366
19.9 policy特征 373
19.10 在标准库中 376
19.11 后记 377
第 20章 类型属性重载 379
20.1 算法特化 379
20.2 标签调度 380
20.3 启用/禁用函数模板 382
20.4 类特化 388
20.5 实例化安全模板 392
20.6 在标准库中 396
20.7 后记 396
第 21章 模板与继承 398
21.1 空基类优化 398
21.2 奇妙递归模板模式 402
21.3 混入 413
21.4 命名模板实参 416
21.5 后记 419
第 22章 桥接静多态与动多态 421
22.1 函数对象、指针以及std::function<> 421
22.2 泛化的函数指针 423
22.3 桥接接口 425
22.4 类型擦除 426
22.5 可选的桥接 427
22.6 性能考虑 429
22.7 后记 429
第 23章 元编程 431
23.1 现代C++元编程的状况 431
23.2 反射元编程的维度 437
23.3 递归实例化的代价 438
23.4 计算完备性 441
23.5 递归实例化还是递归模板实参 441
23.6 枚举值还是静态常量 442
23.7 后记 443
第 24章 类型列表 446
24.1 解剖一个类型列表 446
24.2 类型列表算法 448
24.3 非类型类型列表 459
24.4 使用包扩展来优化算法 462
24.5 cons风格的类型列表 463
24.6 后记 465
第 25章 元组 466
25.1 基础元组设计 466
25.2 基础元组运算 469
25.3 元组算法 471
25.4 展开元组 480
25.5 优化元组 480
25.6 元组索引 485
25.7 后记 487
第 26章 可辨识联合体 489
26.1 存储简介 490
26.2 设计 491
26.3 值的查询与提取 494
26.4 元素初始化、赋值和析构 495
26.5 访问者 500
26.6 variant的初始化和赋值 505
26.7 后记 508
第 27章 表达式模板 510
27.1 临时变量和割裂的循环 510
27.2 在模板实参中对表达式编码 514
27.3 表达式模板的性能与局限 524
27.4 后记 524
第 28章 调试模板 527
28.1 浅层实例化 527
28.2 静态断言 529
28.3 原型 530
28.4 追踪器 532
28.5 预言机 535
28.6 后记 536
附录A 单一定义规则 537
A.1 编译单元 537
A.2 声明和定义 538
A.3 单一定义规则的细节 539
附录B 值类别 545
B.1 传统的左值和右值 545
B.2 C++11值类别 546
B.3 使用decltype检查值类别 549
B.4 引用类型 549
附录C 重载解析 551
C.1 何时应用重载解析 551
C.2 简化过的重载解析 552
C.3 重载的细节 556
附录D 标准库类型实用程序 564
D.1 使用类型特征 564
D.2 基本和复合类型类别 567
D.3 类型属性和操作 572
D.4 类型构造 589
D.5 其他特征 593
D.6 组合类型特征 595
D.7 其他工具 596
附录E 概念 598
E.1 使用概念 598
E.2 定义概念 600
E.3 约束的重载 602
E.4 概念小提示 604
术语表 607