首页>参考读物>计算机科学与技术>综合

C++模板元编程
作者 : (美)David Abrahams  Aleksey Gurtovoy 著
译者 : 荣耀 等译
丛书名 : C++设计新思维
出版日期 : 2009-11-03
ISBN : 978-7-111-26742-3
定价 : 55.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 290
开本 : 16
原书名 : C++ Template Metaprogramming: Concepts, Tools, and Techniques From Boost and Beyond
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书是关于C++模板元编程的著作。本书主要介绍Traits和类型操纵、深入探索元函数、整型外覆器和操作、序列与迭代器、算法、视图与迭代器适配器、诊断、跨越编译期和运行期边界、领域特定的嵌入式语言、DSEL设计演练,另外附录部分还介绍了预处理元编程概述、typename和template关键字。本书通过理论联系实践,深入讲解了C++高级编程技术。

图书特色

“如果你像我一样,对人们在模板元编程(Template Metaprogramming,TMP)方面所做的工作感到兴奋,但对缺乏这方面的清晰指导和强有力的工具感到沮丧,那好,这本书正是我们期待已久的。借助于优秀的Boost Metaprogramming Library,David和Aleksey将TMP从实验室带到了生产一线,以易读的文字和实际的例子向我们展示了‘编译期STL’与其运行期对应物具有同样的能耐。本书既可以作教程,也可以用作专家手册。这是一本关于C++ 的扛鼎之作。”
—— Chuck Allison,The C++ Source编辑

本书清晰地揭示了现代C++最具威力的使用手法,将实际的工具和技术交付普通程序员的手中。
元编程是产生或操纵程序码的程序。自从泛型编程被引入C++中以来,程序员们已经发现用于当程序被编译时对其进行操纵的无数“tricks template”,这些tricks有效地消除了横亘在程序和元编程之间的藩篱。尽管C++专家们对这种能力的兴奋已经波及整个C++社区,然而它们的实际应用对于大多数程序员来说仍然是遥不可及。本书解释了何谓元编程以及如何最佳化地使用它,为你在自己的工作中有效地使用模板元编程提供了必备的基础。
本书瞄准于任何熟悉标准模板库(Standard Template Library,STL)惯用法的程序员。C++高级用户会获得对既有工作新的洞察以及对元编程领域新的认知。那些已经学习了一些高级模板技术的中级程序员将会明白这些tricks是从哪儿适合大画面的,并将获得有秩序地使用它们所需的概念基础。对于那些已经嗅到元编程味道但对其仍然感到神秘的程序员而言,最终将获得对元编程如何工作、何时工作以及为何工作的清晰的理解。无论如何,所有读者都将获得一个可以自由支配的、威力空前的新工具:Boost Metaprogramming Library。

附赠光盘内容包含所有Boost C++ 程序库:Boost Metaprogramming Library及其参考文件,还包含所有随书代码示例以及大量的补充材料。


David Abrahams  Boost C++程序库开发组的一名发起成员和主持人。自从1996年起,Dave就是一名ANSI/ISO C++委员会成员,他因对C++标准程序库异常处理的理论、规格和实现的贡献而名声鹊起。他的公司Boost Consulting提供了与Boost有关的支持和开发服务,以及软件构建艺术的职业培训。
Aleksey Gurtovoy  MetaCommunications的一名技术领导,并且是Boost C++社区的功勋成员。他是Boost Metaprogramming Library最初的作者。自1993年起他就开始研究C++并使用它工作。Aleksey拥有俄罗斯克拉斯诺雅茨克州立技术大学计算机科学理学硕士学位。

图书前言

本书一开始的几章为你了解书中其他大多数内容铺设了必需的概念基础,后续各章通常建立于先前各章讲述的内容之上。也就是说,你可以自由地往前跳读,我们已经尽力使你能够这么做,因为当我们在使用早先介绍过的术语时提供了交叉引用。
  第10章是“后续各章依赖于先前各章”这一规则的例外。它主要集中于概念之上,放在本书靠后的位置,因为到那时你将已经学到了将领域特定的嵌入式语言应用于现实代码中的工具和技术。如果读完本书你只记得一章的内容,希望就是这一章。
  在很多章临近结尾的部分,你都会发现一个名为“细节”的小节,它们总结了关键的思想,而且往往还会添加新材料以深化先前的讨论,因此,即使你在第一遍阅读时倾向于忽略它们,我们还是建议你在以后回头查阅它们。
  大多数章以“练习”结束,它们设计用于帮助你发展编程和概念的能力。那些标以星号(*)的练习被认为比其他练习题困难一些。并非所有练习都要求你写程序,其中一些可以看做是问答题,并且也不是非得完成它们才能接着往下阅读。不过,我们建议你最好浏览它们一下,稍加思考如何回答每一个问题,并且动手做练习,这对于你巩固已经阅读过的内容是一个非常好的办法。如果你需要提示,可以考虑到boost用户邮件列表讨论问题(参见http://www.boost.org/ more/mailing_lists.htm)。本书的Web站点(http://www.boost-consulting.com/mplbook)提供了一组wiki网页链接,其中包含挑选出的练习的答案。
补充材料
  本书附带一张CD,以电子形式提供了以下材料:
   书中的示例代码。
   Boost C++程序库的一个发行版。Boost因高质量、同级复审、可移植、泛型(通用)、可自由(免费)复用而知名。本书中我们广泛地使用了Boost程序库之一:Boost 元编程库(MPL,元编程库),当然我们也讨论了其他一些程序库。
   一个完整的MPL参考手册,包括HTML和PDF两种格式。
   本书中讨论到的、尚未成为正式发行版一部分的Boost程序库。
  CD中顶层index.html文件为你提供了到其包含的所有内容的方便的引导。附加的和更新的材料,以及必不可少的勘误,将出现于本书的Web站点(http://www.boost-consulting.com/mplbook)上。你在那儿还会发现一个用于报告你可能会发现的任何错误的地方。
试验
  为了编译任何例子,只需将CD中的boost_1_32_0/目录设置到你使用的编译器的#include路径中即可。
  我们展示于本书中的程序库已经竭尽全力隐藏不那么完美的编译器的问题,因此,在编译我们展示在这儿的例子过程中不大可能遇到困难。我们将C++编译器大致分为三类:
  A. 大体上符合模板标准实现的编译器。在这些编译器上,示例和程序库完全可以工作。2001年后发布的几乎任何编译器,以及一些早于那个时间发布的编译器,都可归入这个范畴。
  B. 需在客户代码中做一些迂回处理才可以工作的编译器。
  C. 那些太拙劣以致于无法有效地用于模板元编程的编译器。
  附录D列出了已知的符合每一个范畴的编译器。对于类型B中的编译器而言,附录D提及了一个移植手法列表。为了避免使大多数读者为之分心,这些迂回处理方式没有出现在正文中。你可以到本书的Web站点(http://www.boost-consulting.com/mplbook)下载补丁代码。
  CD中还包含了一个有关移植性的表格,它详尽描述了各种编译器是如何处理示例的。对于许多平台而言,GCC都有可以免费获得的版本,且其最新版在处理列在这儿的代码时不会有任何问题。
  即便你手头已经拥有一个处于类型A的相对现代的编译器,获取一份GCC拷贝并使用它来核查代码仍然是个好主意。通常破译难以理解的错误信息的最容易的方式,就是看看其他编译器对你的程序说了些什么。如果你发现当尝试做练习时要与错误信息搏斗,你也许可以往前跳一跳,阅读第8章的头两节,它们讨论了如何阅读和管理诊断信息。
  还等什么,让我们开始C++模板元编程之旅吧!

上架指导

计算机\程序设计

封底文字

“如果你像我一样,对人们在template metaprogramming(TMP)方面所做的工作感到兴奋,但对缺乏这方面的清晰指导和强有力的工具感到沮丧,那好,这本书正是我们期待已久的。借助于优秀的Boost Metaprogramming Library,David和Aleksey将TMP从实验室带到了生产一线,以易读的文字和实际的例子向我们展示了‘编译期STL’与其运行期对应物具有同样的能耐。本书既可以作教程,也可以用作专家的手册。这是一本关于C++ template metaprogramming的扛鼎之作”
——Chuck Allison,The C++ Source编辑

《C++ Template Metaprogramming》清晰地揭示了现代C++最具威力的使用手法,终于将实际的metaprogramming工具和技术交付普通程序员的手中。

metaprogram是产生或操纵程序码的程序。自从generic programming被引入C++中以来,程序员们已经发现用于当程序被编译时对其进行操纵的无数“template tricks”,这些tricks有效地消除了横亘在program和 metaprogram之间的藩篱。尽管C++专家们对这种能力的兴奋已经波及整个C++社群,然而它们的实际应用对于大多数程序员来说仍然是遥不可及。本书解释了何谓metaprogramming以及如何最佳化地使用它,为你在自己的工作中有效地使用template metaprogramming提供了必备的基础。

本书瞄准于任何熟悉Standard Template Library(STL)惯用法的程序员。C++高级用户会获得对既有工作新的洞察以及对metaprogramming领域新的认知。那些已经学习了一些高级template技术的中级程序员将会明白这些tricks是从哪儿适合大画面的,并将获得有秩序地使用它们所需的概念基础。对于那些已经嗅到metaprogramming味道但对其仍然感到神秘的的程序员而言,最终将获得对metaprogramming如何工作、何时工作以及为何工作的清晰的理解。无论如何,所有读者都将获得一个可以自由支配的、威力空前的新工具:Boost Metaprogramming Library。

配书光碟包含所有Boost C++ 程序库、Boost Metaprogramming程序库及其参考文件,还包含所有配书代码示例以及大量的补充材料。

图书序言

1998年,Dave获权参加在德国Dagstuhl Castle举行的泛型编程研讨会。在研讨会临近尾声时,热情的Kristof Czarnecki和Ullrich Eisenecker(在产生式编程领域颇有声望)散发了一些C++源代码,那是采用C++模板编写的完整的Lisp实现清单。那时候,对于Dave而言那不过是个新奇的玩具而已,是对模板系统迷人但不切实际的“劫持”,以证实我们可以编写执行于编译期的程序。他从未想象有朝一日会在自己的大多数日常编程工作中发挥元编程(metaprogramming)的作用。在许多方面,那个模板代码集合是Boost元编程库(Metaprogramming Library, MPL)的先驱:它可能是第一个设计用于将编译期C++从一个特别的“模板技巧”集合转变为正规的、易理解的软件工程的范例的程序库。随着用于编写和理解元程序(metaprogram)的高阶工具的出现,我们发现使用这些技术不但切实可行,而且简单、有趣,并常常带来令人惊讶的威力。
  撇开存在许多采用模板元编程和MPL的真实系统不谈,很多人仍然将元编程视作神秘的魔法,并且在日常产品代码中避免使用它。如果你从未进行过任何元编程,你甚至都看不出它和你所做的工作有什么明显的关系。在这本书中,我们希望能够揭开它的神秘面纱,使你不但对如何进行元编程有所理解,对为何(以及何时)进行元编程也会有很好的认知。最好的事情莫过于,尽管有许多神秘将会云开雾散,但你会发现这个主题中仍然蕴藏足够的神奇,让你流连忘返,受到启迪,获得灵感,如同我们一样。

—Dave和Aleksey

作者简介

(美)David Abrahams  Aleksey Gurtovoy 著:David Abrahams是Boost C++程序库开发组的一名发起成员和主持人。自从1996年起,Dave就是一名ANSI/ISO C++委员会成员,他因对C++标准程序库异常处理的理论、规格和实现的贡献而名声昭著。他的公司Boost Consulting提供了与Boost有关的支持和开发服务,以及软件构建艺术的职业培训。 Aleksey Curtovoy是MetaCommunication的一名技术领导,并且是Boost C++社群的功勋成员。他是Boost Metaprogramming Library最初的作者。自1993年起他就开始研究C++并使用它工作。Aleksey拥有俄罗斯Krasnoyarsk Technical Sate大学计算机科学M.S学位。

译者简介

荣耀 等译:暂无简介

译者序

作为一种高阶C++编程技术,模板元编程突出编译期决策在整个程序构建和运行过程中的地位,努力将计算从运行期提前至编译期,不但有效地防止程序错误被传播到运行期,而且能够实现以静态代码控制动态代码的目标。使计算尽可能完成于编译期也提高了最终程序的运行性能。
  C++模板元编程诞生于十多年前,最初的研究方向是编译期数值计算,后来的实践发展证明,此项技术在类型计算领域可释放出更大的能量。近几年来,由于Andrei Alexandrescu的Loki程序库对元编程的前卫应用,Boost元编程库日益展示出重要的实用价值,C++模板元编程从最初被认为是对模板“过于聪明”的使用,到逐步被学界重视并研究,时至今日,这一高阶编程技术已然为业界所接受。
  C++编程书籍不计其数,但涉及模板元编程的书籍屈指可数。作为Loki的传播者,《Modern C++ Design》对元编程的概念和原理的解释不够细致—这不奇怪,那本书的兴趣更多在于元编程在静态设计模式上的应用。David Vandevoorde和Nicolai M. Josuttis所著的《C++ Templates》,以及Krzysztof Czarnecki和Ulrich W.Eisenecker的著作《Generative Programming》,对模板元编程分别做了概述和总结,它们同样不是专注于元编程自身。Boost的创始人之一David Abrahams与Boost MPL的作者Aleksey Gurtovoy的这部著作第一次系统地阐述了模板元编程。
  本书从内容上分为理论和实践两部分。前八章和部分附录内容以Boost元编程库为主线介绍模板元编程的概念、技术、工具及陷阱。其余篇幅则主要讨论模板元编程的一个重要的应用:DSEL(Domain-Specific Embedded Languages,领域特定的嵌入式语言)的设计与实现。虽然只有少数C++程序员需要创建DSEL,但了解其原理和实现大有裨益,有利于用好他人创建的DSEL,更重要的是,还可从中领会模板元编程的运用手法以及分析、解决实际问题的方法。
  本书阅读门槛较高,适合希望了解模板元编程的中、高阶C++程序员尤其是程序库设计者阅读。如果你缺乏模板元编程必备的基础知识,例如类模板的特化和实例化、双重模板参数、typedef以及模板的继承等,建议参阅侯捷、荣耀和姜宏合译的《C++模板全览》(繁体版)一书,打好基础。
  与常规C++编程技术相比,模板元编程技术较为复杂。因此不少C++程序员以为它高不可攀,或以为它只是库设计者的工具。虽然这项技术一直都没有疏远我们,然而我们自己的不作为却使它显得遥不可及。实际上,面向对象编程与泛型编程、运行期与编译期以及动态与静态之间并不互相排斥,而是对立统一的。从更高处审视C++程序设计,将多种编程范型优势互补,无疑可以开发出对程序员和最终用户而言更强大、更美妙的应用。
  下一代C++标准C++0x将从语言和程序库两方面进一步增强对模板编程的支持,作为模板编程的一个高阶子集,模板元编程也将从中受益。实际上,C++0x还将对模板元编程提供更友好的支持,(部分)Boost元编程程序库将会成为C++0x标准库的一个组成部分。模板元编程与普通C++程序员渐行渐近。现在,就让这本书引领你开始奇妙之旅!
  感谢刘未鹏先生为第3章和附录A做出的高品质初译协助,感谢机械华章陈冀康先生、周茂辉编辑以及其他所有为本书面世付出贡献的人士,感谢朱艳和荣坤,生活因你们而更加精彩。

  祝各位阅读快乐!

荣  耀
2006年6月
南京师范大学中北学院

图书目录

译者序
序言
前言
致谢

第1章  概述 1
1.1  起步走 1
1.2  元程序的概念 1
1.3  在宿主语言中进行元编程 3
1.4  在C++中进行元编程 3
1.4.1  数值计算 3
1.4.2  类型计算 5
1.5  为何进行元编程 6
1.5.1  替代方案1:运行期计算 6
1.5.2  替代方案2:用户分析 6
1.5.3  为何进行C++元编程 7
1.6  何时进行元编程 7
1.7  为何需要元编程程序库 7
第2章  Traits和类型操纵 9
2.1  类型关联 9
2.1.1  采用一种直接的方式 9
2.1.2  采用一种迂回方式 10
2.1.3  寻找一个捷径 11
2.2  元函数 12
2.3  数值元函数 14
2.4  在编译期作出选择 15
2.4.1  进一步讨论iter_swap 15
2.4.2  美中不足 16
2.4.3  另一个美中不足 17
2.4.4  “美中不足”之外覆器 18
2.5  Boost Type Traits程序库概览 19
2.5.1  一般知识 20
2.5.2  主类型归类(Primary Type Categorization) 20
2.5.3  次类型归类(Secondary Type Categorization) 21
2.5.4  类型属性 22
2.5.5  类型之间的关系 23
2.5.6  类型转化 23
2.6  无参元函数 23
2.7  元函数的定义 24
2.8  历史 24
2.9  细节 25
2.9.1  特化 25
2.9.2  实例化 26
2.9.3  多态 26
2.10  练习 27
第3章  深入探索元函数 30
3.1  量纲分析 30
3.1.1  量纲的表示 31
3.1.2  物理量的表示 33
3.1.3  实现加法和减法 33
3.1.4  实现乘法 34
3.1.5  实现除法 37
3.2  高阶元函数 39
3.3  处理占位符 40
3.3.1  lambda元函数 41
3.3.2  apply元函数 42
3.4  lambda的其他能力 43
3.4.1  偏元函数应用 43
3.4.2  元函数复合 43
3.5  Lambda的细节 43
3.5.1  占位符 43
3.5.2  占位符表达式的定义 45
3.5.3  Lambda和非元函数模板 45
3.5.4  “懒惰”的重要性 46
3.6  细节 46
3.7  练习 48
第4章  整型外覆器和操作 49
4.1  布尔外覆器和操作 49
4.1.1  类型选择 49
4.1.2  缓式类型选择 51
4.1.3  逻辑运算符 53
4.2  整数外覆器和运算 55
4.2.1  整型运算符 57
4.2.2  _c整型速记法 58
4.3  练习 59
第5章  序列与迭代器 61
5.1  Concepts 61
5.2  序列和算法 62
5.3  迭代器 62
5.4  迭代器Concepts 63
5.4.1  前向迭代器 63
5.4.2  双向迭代器 64
5.4.3  随机访问迭代器 65
5.5  序列Concepts 66
5.5.1  序列遍历Concepts 66
5.5.2  可扩展性 68
5.5.3  关联式序列 68
5.5.4  可扩展的关联式序列 69
5.6  序列相等性 71
5.7  固有的序列操作 71
5.8  序列类 72
5.8.1  list 72
5.8.2  vector 73
5.8.3  deque 74
5.8.4  range_c 74
5.8.5  map 74
5.8.6  set 75
5.8.7  iterator_range 75
5.9  整型序列外覆器 75
5.10  序列派生 76
5.11  编写你自己的序列 77
5.11.1  构建tiny序列 77
5.11.2  迭代器的表示 78
5.11.3  为tiny实现at 79
5.11.4  完成tiny_iterator的实现 81
5.11.5  begin和end 82
5.11.6  加入扩充性 85
5.12  细节 86
5.13  练习 87
第6章  算法 90
6.1  算法、惯用法、复用和抽象 90
6.2  MPL中的算法 92
6.3  插入器 93
6.4  基础序列算法 95
6.5  查询算法 97
6.6  序列构建算法 98
6.7  编写你自己的算法 100
6.8  细节 101
6.9  练习 102
第7章  视图与迭代器适配器 104
7.1  一些例子 104
7.1.1  对从序列元素计算出来的值进行
比较 104
7.1.2  联合多个序列 107
7.1.3  避免不必要的计算 108
7.1.4  选择性的元素处理 109
7.2  视图Concept 109
7.3  迭代器适配器 110
7.4  编写你自己的视图 110
7.5  历史 112
7.6  练习 112
第8章  诊断 114
8.1  调试错误 114
8.1.1  实例化回溯 114
8.1.2  错误消息格式化怪癖 116
8.2  使用工具进行诊断分析 123
8.2.1  听取他者的意见 124
8.2.2  使用导航助手 124
8.2.3  清理场面 124
8.3  有目的的诊断消息生成 126
8.3.1  静态断言 128
8.3.2  MPL静态断言 129
8.3.3  类型打印 136
8.4  历史 138
8.5  细节 138
8.6  练习 139
第9章  跨越编译期和运行期边界 140
9.1  for_each 140
9.1.1  类型打印 140
9.1.2  类型探访 142
9.2  实现选择 143
9.2.1  if语句 143
9.2.2  类模板特化 144
9.2.3  标签分派 144
9.3  对象生成器 147
9.4  结构选择 149
9.5  类复合 153
9.6  (成员)函数指针作为模板实参 156
9.7  类型擦除 157
9.7.1  一个例子 158
9.7.2  一般化 159
9.7.3  “手工”类型擦除 160
9.7.4  自动类型擦除 161
9.7.5  保持接口 162
9.8  奇特的递归模板模式 164
9.8.1  生成函数 164
9.8.2  管理重载决议 166
9.9  显式管理重载集 168
9.10  sizeof技巧 171
9.11  总结 172
9.12  练习 172
第10章  领域特定的嵌入式语言 173
10.1  一个小型语言 173
10.2  路漫漫其修远兮 175
10.2.1  Make工具语言 175
10.2.2  巴科斯-诺尔模式 177
10.2.3  YACC 179
10.2.4  DSL摘要 181
10.3  DSL 182
10.4  C++用作宿主语言 184
10.5  Blitz++和表达式模板 186
10.5.1  问题 186
10.5.2  表达式模板 187
10.5.3  更多的Blitz++魔法 190
10.6  通用DSEL 191
10.6.1  具名参数 191
10.6.2  构建匿名函数 193
10.7  Boost Spirit程序库 199
10.7.1  闭包 201
10.7.2  子规则 202
10.8  总结 205
10.9  练习 205
第11章  DSEL设计演练 206
11.1  有限状态机 206
11.1.1  领域抽象 206
11.1.2  符号 207
11.2  框架设计目标 208
11.3  框架接口基础 209
11.4  选择一个DSL 210
11.4.1  转换表 210
11.4.2  组装成一个整体 213
11.5  实现 216
11.6  分析 221
11.7  语言方向 223
11.8  练习 223
附录A  预处理元编程简介 226
附录B  typename和template关键字 247
附录C  编译期性能 258
附录D  MPL可移植性摘要 274
参考文献 275

教学资源推荐
作者: Tamara Dean
作者: 朱敏 甘启宏 邓韩彬 主编
作者: [德] 史蒂文·S. 斯基纳(Steven S.Skiena) 著
作者: (美)Paul Ammann; Jeff Offutt 著
参考读物推荐
作者: 钟文枫 编著
作者: (美)Wes McKinney 著
作者: 李斌 黄绍斌 等编著
作者: [美]保罗·戴特尔 (Paul Deitel) 哈维·戴特尔(Harvey Deitel) 著