本书清晰地揭示了现代C++*威力的使用手法,将实际的工具和技术交付普通程序员的手中。
元编程是产生或操纵程序码的程序。自从泛型编程被引入C++中以来,程序员们已经发现用于当程序被编译时对其进行操纵的无数“tricks template”,这些tricks有效地消除了横亘在程序和元编程之间的藩篱。尽管C++专家们对这种能力的兴奋已经波及整个C++社区,然而它们的实际应用对于大多数程序员来说仍然是遥不可及。本书解释了何谓元编程以及如何*化地使用
它,为你在自己的工作中有效地使用模板元编程提供了必备的基础。
本书瞄准于任何熟悉标准模板库(Standard Template Library,STL)惯用法的程序员。C++高级用户会获得对既有工作新的洞察以及对元编程领域新的认知。那些已经学习了一些高级模板技术的中级程序员将会明白这些tricks是从哪儿适合大画面的。并将获得有秩序地使用它们所需的概念基础。对于那些已经嗅到元编程味道但对其仍然感到神秘的程序员而言,最终将获得对元编程如何工作、何时工作以及为何工作的清晰的理解。无论如何,所有读者都将获得一个可以自由支配的、威力空前的新工具:Boost MetaDroaramming Library。
内容简介
《C++模板元编程》是关于C++模板元编程的著作。《C++模板元编程》主要介绍Traits和类型操纵、深入探索元函数、整型外覆器和操作、序列与迭代器、算法、视图与迭代器适配器、诊断、跨越编译期和运行期边界、领域特定的嵌入式语言、DSEL设计演练,另外附录部分还介绍了预处理元编程概述、typename和template关键字。《C++模板元编程》通过理论联系实践,深入讲解了C++高级编程技术。
《C++模板元编程》适合中、高阶C++程序员等参考。
附赠光盘内容包含所有Boost C++程序库:Boost Metaprog ramming Library及其参考文件,还包含所有随书代码示例以及大量的补充材料。
目录
- 译者序
- 序言
- 前言
- 致谢
- 第1章 概述
- 1.1 起步走
- 1.2 元程序的概念
- 1.3 在宿主语言中进行元编程
- 1.4 在C++中进行元编程
- 1.4.1 数值计算
- 1.4.2 类型计算
- 1.5 为何进行元编程
- 1.5.1 替代方案1:运行期计算
- 1.5.2 替代方案2:用户分析
- 1.5.3 为何进行C++元编程
- 1.6 何时进行元编程
- 1.7 为何需要元编程程序库
- 第2章 Traits和类型操纵
- 2.1 类型关联
- 2.1.1 采用一种直接的方式
- 2.1.2 采用一种迂回方式
- 2.1.3 寻找一个捷径
- 2.2 元函数
- 2.3 数值元函数
- 23.4 在编译期作出选择
- 2.4.1 进一步讨论iter_swap
- 2.4.2 美中不足
- 2.4.3 另一个美中不足
- 2.4.4 “美中不足”之外覆器
- 2.5 Boost Type Traits程序库概览
- 2.5.1 一般知识
- 2.5.2 主类型归类(Primary Type Categorization)
- 2.5.3 次类型归类(Secondary Type Categorization)
- 2.5.4 类型属性
- 2.5.5 类型之间的关系
- 2.5.6 类型转化
- 2.6 无参元函数
- 2.7 元函数的定义
- 2.8 历史
- 2.9 细节
- 2.9.1 特化
- 2.9.2 实例化
- 2.9.3 多态
- 2.10练习
- 第3章 深入探索元函数
- 3.1 量纲分析
- 3.1.1 量纲的表示
- 3.1.2 物理量的表示
- 3.1.3 实现加法和减法
- 3.1.4 实现乘法
- 3.1.5 实现除法
- 3.2 高阶元函数
- 3.3 处理占位符
- 3.3.1 lambda元函数
- 3.3.2 apply元函数
- 3.4 lambda的其他能力
- 3.4.1 偏元函数应用
- 3.4.2 元函数复合
- 3.5 Lambda的细节
- 3.5.1 占位符
- 3.5.2 占位符表达式的定义
- 3.5.3 Lambda和非元函数模板
- 3.5.4 “懒惰”的重要性
- 3.6 细节
- 3.7 练习
- 第4章 整型外覆器和操作
- 4.1 布尔外覆器和操作
- 4.1.1 类型选择
- 4.1.2 缓式类型选择
- 4.1.3 逻辑运算符
- 4.2 整数外覆器和运算
- 4.2.1 整型运算符
- 4.2.2 _c整型速记法
- 4.3 练习
- 第5章 序列与迭代器
- 5.1 Concepts
- 5.2 序列和算法
- 5.3 迭代器
- 5.4 迭代器Concepts
- 5.4.1 前向迭代器
- 5.4.2 双向迭代器
- 5.4.3 随机访问迭代器
- 5.5 序列Concepts
- 5.5.1 序列遍历Concepts
- 5.5.2 可扩展性
- 5.5.3 关联式序列
- 5.5.4 可扩展的关联式序列
- 5.6 序列相等性
- 5.7 固有的序列操作
- 5.8 序列类
- 5.8.1 list
- 5.8.2 vector
- 5.8.3 deque
- 5.8.4 range_c
- 5.8.5 map
- 5.8.6 set
- 5.8.7 iterator_range
- 5.9 整型序列外覆器
- 5.10 序列派生
- 5.11 编写你自己的序列
- 5.11.1 构建tiny序列
- 5.11.2 迭代器的表示
- 5.11.3 为tiny实现at.
- 5.11.4 完成tiny_iterator的实现
- 5.11.5 begin和end
- 5.11.6 加入扩充性
- 5.12 细节
- 5.13 练习
- 第6章 算法
- 6.1 算法、惯用法、复用和抽象
- 6.2 MPL的算法
- 6.3 插入器
- 6.4 基础序列算法
- 6.5 查询算法
- 6.6 序列构建算法
- 6.7 编写你自己的算法
- 6.8 细节
- 6.9 练习
- 第7章 视图与迭代器适配器
- 7.1 一些例子
- 7.1.1 对从序列元素计算出来的值进行比较
- 7.1.2 联合多个序列
- 7.1.3 避免不必要的计算
- 7.1.4 选择性的元素处理
- 7.2 视图Concept
- 7.3 迭代器适配器
- 7.4 编写你自己的视图
- 7.5 历史
- 7.6 练习
- 第8章 诊断
- 8.1 调试错误
- 8.1.1 实例化回溯
- 8.1.2 错误消息格式化怪癖
- 8.2 使用工具进行诊断分析
- 8.2.1 听取他者的意见
- 8.2.2 使用导航助手
- 8.2.3 清理场面
- 8.3 有目的的诊断消息生成
- 8.3.1 静态断言
- 8.3.2 MPL静态断言
- 8.3.3 类型打印
- 8.4 历史
- 8.5 细节
- 8.6 练习
- 第9章 跨越编译期和运行期边界
- 9.1 forl_each
- 9.1.1 类型打印
- 9.1.2 类型探访
- 9.2 实现选择
- 9.2.1 if语句
- 9.2.2 类模板特化
- 9.2.3 标签分派
- 9.3 对象生成器
- 9.4 结构选择
- 9.5 类复合
- 9.6 (成员)函数指针作为模板实参
- 9.7 类型擦除
- 9.7.1 一个例子
- 9.7.2 一般化
- 9.7.3 “手工”类型擦除
- 9.7.4 自动类型擦除
- 9.7.5 保持接口
- 9.8 奇特的递归模板模式
- 9.8.1 生成函数
- 9.8.2 管理重载决议
- 9.9 显式管理重载集
- 9.10 sizeof技巧
- 9.11 总结
- 9.12 练习
- 第10章 领域特定的嵌入式语言
- 10.1 一个小型语言
- 10.2 路漫漫其修远兮
- 10.2.1 Make工具语言
- 10.2.2 巴科斯一诺尔模式
- 10.2.3 YACC
- 10.2.4 DSL摘要
- 10.3 DSL
- 10.4 C++用作宿主语言
- 10.5 Blitz++和表达式模板
- 10.5.1 问题
- 10.5.2 表达式模板
- 10.5.3 更多的Blitz++魔法
- 10.6 通用DSEL
- 10.6.1 具名参数
- 10.6.2 构建匿名函数
- 10.7 BoostSpirit程序库
- 10.7.1 闭包
- 10.7.2 子规则
- 10.8 总结
- 10.9 练习
- 第11章 DSEL设计演练
- 11.1 有限状态机
- 11.1.1 领域抽象
- 11.1.2 符号
- 11.2 框架设计目标
- 11.3 框架接口基础
- 11.4 选择一个DSL
- 11.4.1 转换表
- 11.4.2 组装成一个整体
- 11.5 实现
- 11.6 分析
- 11.7 语言方向
- 11.8 练习
- 附录A 预处理元编程简介
- 附录B typename和template关键字
- 附录C 编译期性能
- 附录D MPL可移植性摘要
- 参考文献