-
内容大纲
本书是一本全面介绍C++模板技术的图书,主要内容涵盖C++模板的基础概念、语言细节、编程技巧、高级应用以及实用示例等。本书针对C++11、C++14、C++17标准进行了内容更新,并对很多新语言特性(包括变量模板、泛型lambda、类模板参数推导等)给出详细解释。通过阅读本书,读者可以深入理解C++模板技术,掌握开发有效、简洁且易维护的软件的原因、时机和方法。
本书内容丰富,架构清晰,讲解翔实,适合对C++模板技术感兴趣的开发人员或爱好者阅读。 -
作者介绍
-
目录
第一部分 基础知识
第1章 函数模板
1.1 函数模板初探
1.1.1 定义模板
1.1.2 使用模板
1.1.3 两阶段编译
1.2 模板实参推导简介
1.3 多模板参数
1.3.1 返回类型的模板参数
1.3.2 推导返回类型
1.3.3 返回类型为公共类型
1.4 默认模板实参简介
1.5 重载函数模板简介
1.6 难道,我们不应该……
1.6.1 传值还是传引用
1.6.2 为什么不使用inline
1.6.3 为什么不使用constexpr
1.7 小结
第2章 类模板
2.1 类模板Stack的实现
2.1.1 类模板的声明
2.1.2 成员函数的实现
2.2 类模板Stack的使用
2.3 部分使用类模板
2.4 友元简介
2.5 类模板的特化
2.6 偏特化
2.7 默认类模板实参
2.8 类型别名
2.9 类模板实参推导
2.10 模板化聚合体
2.11 小结
第3章 非类型模板参数
3.1 非类型的类模板参数
3.2 非类型的函数模板参数
3.3 非类型模板参数的限制
3.4 模板参数类型auto
3.5 小结
第4章 变参模板
4.1 变参模板简介
4.1.1 变参模板示例
4.1.2 变参和非变参模板的重载
4.1.3 sizeof...运算符
4.2 折叠表达式
4.3 变参模板应用
4.4 变参类模板和变参表达式
4.4.1 变参表达式
4.4.2 变参索引
4.4.3 变参类模板
4.4.4 变参推导指引
4.4.5 变参基类和using关键字
4.5 小结
第5章 基本技巧
5.1 关键字typename
5.2 零初始化
5.3 使用this
5.4 处理原始数组和字符串字面量的模板
5.5 成员模板
5.5.1 template构造
5.5.2 泛型lambda和成员模板
5.6 变量模板
5.7 模板的模板参数简介
5.8 小结
第6章 移动语义和enable_if
6.1 完美转发简介
6.2 特殊成员函数模板
6.3 通过std::enable_if禁用模板
6.4 使用enable_if
6.5 使用概念简化enable_if表达式
6.6 小结
第7章 传值还是传引用
7.1 传值
7.2 传引用
7.2.1 传递常量引用
7.2.2 传递非常量引用
7.2.3 传递转发引用
7.3 使用std::ref()和std::cref()
7.4 处理字符串字面量和原始数组
7.5 处理返回值
7.6 推荐的模板参数声明方法
7.7 小结
第8章 编译期编程
8.1 模板元编程
8.2 使用constexpr计算
8.3 偏特化的执行路径选择
8.4 SFINAE
8.5 编译期if简介
8.6 小结
第9章 在实践中使用模板
9.1 包含模型简介
9.1.1 链接器错误
9.1.2 头文件中的模板
9.2 模板和inline
9.3 预编译头文件
9.4 破译大篇错误信息
9.5 后记
9.6 小结
第10章 模板基本术语
10.1 是“类模板”还是“模板类”
10.2 替换、实例化和特化
10.3 声明和定义
10.4 单一定义规则
10.5 模板实参和模板形参
10.6 小结
第11章 泛型库
11.1 可调用对象
11.1.1 函数对象的支持
11.1.2 处理成员函数及额外的参数
11.1.3 封装函数调用
11.2 实现泛型库的其他工具
11.2.1 类型特征
11.2.2 std::addressof()
11.2.3 std::declval()
11.3 完美转发临时变量
11.4 作为模板参数的引用
11.5 推迟估算
11.6 关于泛型库的思考
11.7 小结
第二部分 深入模板
第12章 深入模板基础
12.1 参数化的声明
12.1.1 虚成员函数
12.1.2 模板的链接
12.1.3 主模板
12.2 模板参数
12.2.1 类型参数
12.2.2 非类型参数
12.2.3 模板的模板参数
12.2.4 模板参数包
12.2.5 默认模板实参
12.3 模板实参
12.3.1 函数模板实参
12.3.2 类型实参
12.3.3 非类型模板实参
12.3.4 模板的模板实参
12.3.5 实参的等价性
12.4 变参模板
12.4.1 包扩展
12.4.2 包扩展的时机
12.4.3 函数参数包
12.4.4 多重和嵌套包扩展
12.4.5 零长度包扩展
12.4.6 折叠表达式
12.5 友元
12.5.1 类模板的友元类
12.5.2 类模板的友元函数
12.5.3 友元模板
12.6 后记
第13章 模板中的名称
13.1 名称的分类
13.2 名称查找
13.2.1 依赖于参数的查找
13.2.2 依赖于参数的友元声明的查找
13.2.3 注入的类名称
13.2.4 当前的实例化
13.3 解析模板
13.3.1 非模板中的上下文相关性
13.3.2 依赖类型的名称
13.3.3 依赖模板的名称
13.3.4 using声明中的依赖型名称
13.3.5 ADL和显式模板实参
13.3.6 依赖型表达式
13.3.7 编译器错误
13.4 继承和类模板
13.4.1 非依赖型基类
13.4.2 依赖型基类
13.5 后记
第14章 实例化
14.1 按需实例化
14.2 延迟实例化
14.2.1 部分和完全实例化
14.2.2 实例化组件
14.3 C++的实例化模型
14.3.1 两阶段查找
14.3.2 实例化点
14.3.3 包含模型
14.4 实现方案
14.4.1 贪婪实例化
14.4.2 查询实例化
14.4.3 迭代实例化
14.5 显式实例化
14.5.1 手动实例化
14.5.2 显式实例化声明
14.6 编译期的if语句
14.7 标准库
14.8 后记
第15章 模板实参推导
15.1 推导的过程
15.2 推导的上下文
15.3 特殊的推导情况
15.4 初始化列表
15.5 参数包
15.6 右值引用
15.6.1 引用折叠规则
15.6.2 转发引用
15.6.3 完美转发
15.6.4 推导的意外情况
15.7 SFINAE
15.8 推导的限制
15.8.1 可行的实参转换
15.8.2 类模板实参
15.8.3 默认调用实参
15.8.4 异常规范
15.9 显式函数模板参数
15.10 基于初始化器和表达式的推导
15.10.1 auto类型的规范
15.10.2 使用decltype表示一个表达式的类型
15.10.3 decltype(auto)
15.10.4 auto推导的特殊情况
15.10.5 结构化绑定
15.10.6 泛型lambda表达式
15.11 别名模板
15.12 类模板参数推导
15.12.1 推导指引
15.12.2 隐式推导指引
15.12.3 其他
15.13 后记
第16章 特化与重载
16.1 当“泛型代码”不是特别适用的时候
16.1.1 透明自定义
16.1.2 语义的透明性
16.2 重载函数模板
16.2.1 签名
16.2.2 重载的函数模板的局部排序
16.2.3 正式的排序规则
16.2.4 模板和非模板
16.2.5 变参函数模板
16.3 显式特化
16.3.1 全局的类模板特化
16.3.2 全局的函数模板特化
16.3.3 全局的变量模板特化
16.3.4 全局的成员特化
16.4 类模板偏特化
16.5 变量模板偏特化
16.6 后记
第17章 未来方向
17.1 宽松的typename规则
17.2 广义非类型模板参数
17.3 函数模板的偏特化
17.4 命名模板实参简介
17.5 重载类模板
17.6 中间包扩展的演绎
17.7 void的规则化
17.8 模板的类型检查
17.9 反射元编程
17.10 包管理工具
17.11 模块
第三部分 模板与设计
第18章 模板的多态
18.1 动多态
18.2 静多态
18.3 动多态与静多态
18.4 使用概念
18.5 新形式的设计模式
18.6 泛型程序设计
18.7 后记
第19章 特征的实现
19.1 一个实例:累加一个序列
19.1.1 固定特征
19.1.2 值特征
19.1.3 参数化特征
19.2 特征、policy及policy类
19.2.1 特征和policy的区别
19.2.2 成员模板和模板的模板参数
19.2.3 组合多个policy和(或)特征
19.2.4 运用普通的迭代器进行累积
19.3 类型函数
19.3.1 元素类型
19.3.2 转换特征
19.3.3 谓词特征
19.3.4 结果类型特征
19.4 基于SFINAE的特征
19.4.1 SFINAE函数重载
19.4.2 SFINAE偏特化
19.4.3 为SFINAE使用泛型lambda表达式
19.4.4 SFINAE友好的特征
19.5 IsConvertibleT
19.6 检测成员
19.6.1 检测成员类型
19.6.2 检测任意的成员类型
19.6.3 检测nontype成员
19.6.4 使用泛型lambda检测成员
19.7 其他特征技术
19.7.1 if-then-else
19.7.2 检测nonthrowing操作
19.7.3 特征的便利性
19.8 类型分类
19.8.1 确定基本类型
19.8.2 确定复合类型
19.8.3 识别函数类型
19.8.4 确定类类型
19.8.5 确定枚举类型
19.9 policy特征
19.10 在标准库中
19.11 后记
第20章 类型属性重载
20.1 算法特化
20.2 标签调度
20.3 启用禁用函数模板
20.3.1 提供多种特化
20.3.2 EnableIf去往何处
20.3.3 编译期if
20.3.4 术语
20.4 类特化
20.4.1 启用禁用类模板
20.4.2 类模板的标签调度
20.5 实例化安全模板
20.6 在标准库中
20.7 后记
第21章 模板与继承
21.1 空基类优化
21.1.1 布局原则
21.1.2 作为基类的成员
21.2 奇妙递归模板模式
21.2.1 Barton-Nackman技巧
21.2.2 运算符实现
21.2.3 门面模式
21.3 混入
21.3.1 奇妙的混入
21.3.2 参数化的虚拟性
21.4 命名模板实参
21.5 后记
第22章 桥接静多态与动多态
22.1 函数对象、指针以及std::function
22.2 泛化的函数指针
22.3 桥接接口
22.4 类型擦除
22.5 可选的桥接
22.6 性能考虑
22.7 后记
第23章 元编程
23.1 现代C++元编程的状况
23.1.1 值元编程
23.1.2 类型元编程
23.1.3 混合元编程
23.1.4 单位类型的混合元编程
23.2 反射元编程的维度
23.3 递归实例化的代价
23.4 计算完备性
23.5 递归实例化还是递归模板实参
23.6 枚举值还是静态常量
23.7 后记
第24章 类型列表
24.1 解剖一个类型列表
24.2 类型列表算法
24.2.1 索引
24.2.2 寻找最佳匹配
24.2.3 追加元素到类型列表
24.2.4 反转类型列表
24.2.5 转化类型列表
24.2.6 累加类型列表
24.2.7 插入排序
24.3 非类型类型列表
24.4 使用包扩展来优化算法
24.5 cons风格的类型列表
24.6 后记
第25章 元组
25.1 基础元组设计
25.1.1 存储
25.1.2 构造
25.2 基础元组运算
25.2.1 比较
25.2.2 输出
25.3 元组算法
25.3.1 作为类型列表
25.3.2 增删
25.3.3 反转
25.3.4 索引列表
25.3.5 用索引列表反转
25.3.6 重排和选择
25.4 展开元组
25.5 优化元组
25.5.1 元组和EBCO
25.5.2 常数时间复杂度的get()
25.6 元组索引
25.7 后记
第26章 可辨识联合体
26.1 存储简介
26.2 设计
26.3 值的查询与提取
26.4 元素初始化、赋值和析构
26.4.1 初始化
26.4.2 析构
26.4.3 赋值
26.5 访问者
26.5.1 访问结果类型
26.5.2 公共结果类型
26.6 variant的初始化和赋值
26.7 后记
第27章 表达式模板
27.1 临时变量和割裂的循环
27.2 在模板实参中对表达式编码
27.2.1 表达式模板的操作数
27.2.2 Array类型
27.2.3 运算符
27.2.4 回顾
27.2.5 表达式模板赋值
27.3 表达式模板的性能与局限
27.4 后记
第28章 调试模板
28.1 浅层实例化
28.2 静态断言
28.3 原型
28.4 追踪器
28.5 预言机
28.6 后记
附录A 单一定义规则
A.1 编译单元
A.2 声明和定义
A.3 单一定义规则的细节
A.3.1 程序中的单一定义约束
A.3.2 编译单元中的单一定义约束
A.3.3 跨编译单元的等价性约束
附录B 值类别
B.1 传统的左值和右值
B.2 C++11值类别
B.3 使用decltype检查值类别
B.4 引用类型
附录C 重载解析
C.1 何时应用重载解析
C.2 简化过的重载解析
C.2.1 成员函数的隐含实参
C.2.2 精细完美匹配
C.3 重载的细节
C.3.1 非模板优先或更特化的模板
C.3.2 转换序列
C.3.3 指针的转型
C.3.4 初始化列表
C.3.5 仿函数和代理函数
C.3.6 其他的重载情况
附录D 标准库类型实用程序
D.1 使用类型特征
D.1.1 std::integral_constant和std::bool_constant
D.1.2 使用特征时应该知道的事
D.2 基本和复合类型类别
D.2.1 基本类型类别的测试
D.2.2 复合类型类别的测试
D.3 类型属性和操作
D.3.1 其他类型属性
D.3.2 特定操作测试
D.3.3 类型之间的关系
D.4 类型构造
D.5 其他特征
D.6 组合类型特征
D.7 其他工具
附录E 概念
E.1 使用概念
E.2 定义概念
E.3 约束的重载
E.3.1 约束的归并
E.3.2 约束和标签调度
E.4 概念小提示
E.4.1 测试概念
E.4.2 概念粒度
E.4.3 二进制兼容性
术语表
同类热销排行榜
- C语言与程序设计教程(高等学校计算机类十二五规划教材)16
- 电机与拖动基础(教育部高等学校自动化专业教学指导分委员会规划工程应用型自动化专业系列教材)13.48
- 传感器与检测技术(第2版高职高专电子信息类系列教材)13.6
- ASP.NET项目开发实战(高职高专计算机项目任务驱动模式教材)15.2
- Access数据库实用教程(第2版十二五职业教育国家规划教材)14.72
- 信号与系统(第3版下普通高等教育九五国家级重点教材)15.08
- 电气控制与PLC(普通高等教育十二五电气信息类规划教材)17.2
- 数字电子技术基础(第2版)17.36
- VB程序设计及应用(第3版十二五职业教育国家规划教材)14.32
- Java Web从入门到精通(附光盘)/软件开发视频大讲堂27.92
推荐书目
-
孩子你慢慢来/人生三书 华人世界率性犀利的一枝笔,龙应台独家授权《孩子你慢慢来》20周年经典新版。她的《...
-
时间简史(插图版) 相对论、黑洞、弯曲空间……这些词给我们的感觉是艰深、晦涩、难以理解而且与我们的...
-
本质(精) 改革开放40年,恰如一部四部曲的年代大戏。技术突变、产品迭代、产业升级、资本对接...