《C++ Templates 第2版 英文版》PDF下载

  • 购买积分:21 如何计算积分?
  • 作  者:(美)戴维·范德沃德(David Vandevoorde),(德)尼古拉·约祖蒂斯
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2018
  • ISBN:9787115479938
  • 页数:788 页
图书介绍:本书讲解了使用C++模板来开发高效、简洁且易维护的软件的原因、时机和方法。本书针对C++11、C++14、C++17标准进行了全面更新,并对所有的新语言特性(包括可变参数模板、通用lambda、类模板参数推导等)进行了权威的解释,这些特性或者用于改进模板,或者是与模板进行交互,此外还深入介绍了基本的语言概念,以及所有的标准类型的特征。

第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