C++ Templates(第2版) 中文版
- ISBN:9787115601513
- 装帧:平装-胶订
- 册数:暂无
- 重量:暂无
- 开本:16开
- 页数:644
- 出版时间:2024-01-01
- 条形码:9787115601513 ; 978-7-115-60151-3
本书特色
1.详细分析代码示例
本书通过丰富的带有注释的代码示例,覆盖C 11、C 14、C 17的语言特性,并描述了其内部工作原理。无论是初学者还是专业程序员,都能了解到本书所具有的宝贵价值。
2.科学合理的内容安排
3位经验丰富的C 开发人员将展示为什么、何时以及如何使用现代模板来构建更简洁、更快速、更有效、更易于维护的软件。
3.读者轻松愉快地学习
通过丰富的提示、注意等板块设计让读者轻松愉快地学会C 模板。
4.下载代码示例
本书提供可下载的代码示例,方便读者亲手实践。
内容简介
本书是一本全面介绍C++模板技术的图书,主要内容涵盖C++模板的基础概念、语言细节、编程技巧、高级应用以及实用示例等。本书针对C++11、C++14、C++17标准进行了内容更新,并对很多新语言特性(包括变量模板、泛型lambda、类模板参数推导等)给出详细解释。通过阅读本书,读者可以深入理解C++模板技术,掌握开发有效、简洁且易维护的软件的原因、时机和方法。 本书内容丰富,架构清晰,讲解翔实,适合对C++模板技术感兴趣的开发人员或爱好者阅读。
目录
第 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禁用 模板 79
6.4 使用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.1.1 函数对象的支持 128
11.1.2 处理成员函数及额外的 参数 130
11.1.3 封装函数调用 132
11.2 实现泛型库的其他工具 133
11.2.1 类型特征 133
11.2.2 std::addressof() 135
11.2.3 std::declval() 135
11.3 完美转发临时变量 136
11.4 作为模板参数的引用 137
11.5 推迟估算 140
11.6 关于泛型库的思考 141
11.7 小结 141
第二部分 深入模板
第 12章 深入模板基础 144
12.1 参数化的声明 144
12.1.1 虚成员函数 148
12.1.2 模板的链接 148
12.1.3 主模板 150
12.2 模板参数 150
12.2.1 类型参数 150
12.2.2 非类型参数 151
12.2.3 模板的模板参数 152
12.2.4 模板参数包 153
12.2.5 默认模板实参 154
12.3 模板实参 156
12.3.1 函数模板实参 156
12.3.2 类型实参 158
12.3.3 非类型模板实参 158
12.3.4 模板的模板实参 160
12.3.5 实参的等价性 162
12.4 变参模板 163
12.4.1 包扩展 163
12.4.2 包扩展的时机 164
12.4.3 函数参数包 166
12.4.4 多重和嵌套包扩展 167
12.4.5 零长度包扩展 168
12.4.6 折叠表达式 169
12.5 友元 170
12.5.1 类模板的友元类 170
12.5.2 类模板的友元函数 171
12.5.3 友元模板 173
12.6 后记 174
第 13章 模板中的名称 175
13.1 名称的分类 175
13.2 名称查找 177
13.2.1 依赖于参数的查找 178
13.2.2 依赖于参数的友元 声明的查找 179
13.2.3 注入的类名称 180
13.2.4 当前的实例化 181
13.3 解析模板 183
13.3.1 非模板中的上下文 相关性 183
13.3.2 依赖类型的名称 186
13.3.3 依赖模板的名称 188
13.3.4 using声明中的依赖型 名称 189
13.3.5 ADL和显式模板实参 190
13.3.6 依赖型表达式 190
13.3.7 编译器错误 192
13.4 继承和类模板 193
13.4.1 非依赖型基类 193
13.4.2 依赖型基类 194
13.5 后记 196
第 14章 实例化 198
14.1 按需实例化 198
14.2 延迟实例化 200
14.2.1 部分和完全实例化 200
14.2.2 实例化组件 200
14.3 C 的实例化模型 203
14.3.1 两阶段查找 203
14.3.2 实例化点 204
14.3.3 包含模型 207
14.4 实现方案 207
14.4.1 贪婪实例化 209
14.4.2 查询实例化 210
14.4.3 迭代实例化 211
14.5 显式实例化 212
14.5.1 手动实例化 212
14.5.2 显式实例化声明 214
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.6.1 引用折叠规则 225
15.6.2 转发引用 226
15.6.3 完美转发 227
15.6.4 推导的意外情况 229
15.7 SFINAE 230
15.8 推导的限制 233
15.8.1 可行的实参转换 233
15.8.2 类模板实参 234
15.8.3 默认调用实参 234
15.8.4 异常规范 235
15.9 显式函数模板参数 236
15.10 基于初始化器和表达式的 推导 238
15.10.1 auto类型的规范 238
15.10.2 使用decltype表示一个表达式的类型 242
15.10.3 decltype(auto) 244
15.10.4 auto推导的特殊 情况 246
15.10.5 结构化绑定 249
15.10.6 泛型lambda表达式 252
15.11 别名模板 254
15.12 类模板参数推导 255
15.12.1 推导指引 256
15.12.2 隐式推导指引 257
15.12.3 其他 259
15.13 后记 262
第 16章 特化与重载 264
16.1 当“泛型代码”不是特别适用的时候 264
16.1.1 透明自定义 265
16.1.2 语义的透明性 266
16.2 重载函数模板 267
16.2.1 签名 267
16.2.2 重载的函数模板的局部排序 269
16.2.3 正式的排序规则 270
16.2.4 模板和非模板 272
16.2.5 变参函数模板 274
16.3 显式特化 276
16.3.1 全局的类模板特化 276
16.3.2 全局的函数模板特化 279
16.3.3 全局的变量模板特化 281
16.3.4 全局的成员特化 281
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.2.1 特征和policy的区别 323
19.2.2 成员模板和模板的模板 参数 324
19.2.3 组合多个policy和(或)特征 325
19.2.4 运用普通的迭代器进行累积 325
19.3 类型函数 326
19.3.1 元素类型 327
19.3.2 转换特征 329
19.3.3 谓词特征 334
19.3.4 结果类型特征 336
19.4 基于SFINAE的特征 339
19.4.1 SFINAE函数重载 339
19.4.2 SFINAE偏特化 342
19.4.3 为SFINAE使用泛型lambda表达式 343
19.4.4 SFINAE友好的特征 346
19.5 IsConvertibleT 349
19.6 检测成员 351
19.6.1 检测成员类型 351
19.6.2 检测任意的成员类型 353
19.6.3 检测nontype成员 354
19.6.4 使用泛型lambda检测 成员 357
19.7 其他特征技术 359
19.7.1 if-then-else 359
19.7.2 检测nonthrowing 操作 362
19.7.3 特征的便利性 364
19.8 类型分类 366
19.8.1 确定基本类型 366
19.8.2 确定复合类型 368
19.8.3 识别函数类型 371
19.8.4 确定类类型 372
19.8.5 确定枚举类型 373
19.9 policy特征 373
19.10 在标准库中 376
19.11 后记 377
第 20章 类型属性重载 379
20.1 算法特化 379
20.2 标签调度 380
20.3 启用/禁用函数模板 382
20.3.1 提供多种特化 383
20.3.2 EnableIf去往何处 385
20.3.3 编译期if 386
20.3.4 术语 387
20.4 类特化 388
20.4.1 启用/禁用类模板 388
20.4.2 类模板的标签调度 390
20.5 实例化安全模板 392
20.6 在标准库中 396
20.7 后记 396
第 21章 模板与继承 398
21.1 空基类优化 398
21.1.1 布局原则 398
21.1.2 作为基类的成员 400
21.2 奇妙递归模板模式 402
21.2.1 Barton-Nackman 技巧 404
21.2.2 运算符实现 406
21.2.3 门面模式 407
21.3 混入 413
21.3.1 奇妙的混入 415
21.3.2 参数化的虚拟性 415
21.4 命名模板实参 416
21.5 后记 419
第 22章 桥接静多态与动多态 421
22.1 函数对象、指针以及std::function
作者简介
David Vandevoorde是Edison Design Group公司的工程副总裁,负责设计公司C 编译器的关键功能。他是comp.lang.c .moderated论坛的创办人之一,也是C 标准化的积极参与者。他拥有伦斯勒理工学院的计算机科学博士学位和硕士学位,以及布鲁塞尔自由大学的工程硕士学位。他的技术兴趣包括算法开发和培训。 Nicolai M. Josuttis是一名独立的系统架构师、技术经理、顾问和培训师,20多年来一直活跃在C 标准化领域。作为库工作组的成员,他特别关注普通开发人员的观点。他是《C 标准库(第2版)》等图书的作者。 Douglas Gregor是一名经验丰富的编译器开发人员,具有C 库设计背景。作为Boost的早期贡献者,他开发的多个库已成为C 标准的一部分。后来,他作为代码所有者负责开源Clang C 编译器的实施,直至完成对C 11的支持,并积极参与了C 11的标准化工作。他拥有伦斯勒理工学院的计算机科学博士学位。
-
深度学习的数学
¥43.5¥69.0 -
全图解零基础word excel ppt 应用教程
¥19.0¥48.0 -
机器学习
¥59.4¥108.0 -
有限与无限的游戏:一个哲学家眼中的竞技世界
¥37.4¥68.0 -
智能硬件项目教程:基于ARDUINO(第2版)
¥31.9¥65.0 -
硅谷之火-人与计算机的未来
¥14.3¥39.8 -
元启发式算法与背包问题研究
¥38.2¥49.0 -
AI虚拟数字人:商业模式+形象创建+视频直播+案例应用
¥62.9¥89.8 -
UNIX环境高级编程(第3版)
¥164.9¥229.0 -
剪映AI
¥52.8¥88.0 -
深度学习高手笔记 卷2:经典应用
¥90.9¥129.8 -
纹样之美:中国传统经典纹样速查手册
¥76.3¥109.0 -
UG NX 12.0数控编程
¥22.1¥45.0 -
MATLAB计算机视觉与深度学习实战(第2版)
¥90.9¥128.0 -
界面交互设计理论研究
¥30.8¥56.0 -
微机组装与系统维护技术教程(第二版)
¥37.8¥43.0 -
明解C语言:实践篇
¥62.9¥89.8 -
Linux服务器架设实战(Linux典藏大系)
¥83.3¥119.0 -
Visual Basic 语言程序设计基础(第6版)
¥32.0¥45.0 -
贝叶斯推理与机器学习
¥139.3¥199.0