没有合适的资源?快使用搜索试试~ 我知道了~
首页C++ Metaprogramming 和 Boost MPL
C++ Metaprogramming 和 Boost MPL
需积分: 15 18 下载量 151 浏览量
更新于2023-07-20
收藏 307KB DOC 举报
C++ Metaprogramming 和 Boost MPL C++ 模板元编程的一些要点
资源详情
资源推荐
C++ Metaprogramming 和 Boost MPL
引论
C++的发展史是一个不断吸收程序设计领域精华和不断积累充实语言特性的过
程。它的创造者 Stroustrup 在这门新的编程语言草创之初就定下了几个基本
的目标,二十年过去了,至今这些目标仍然是 C++继续发展的指南针。其中他
明确指出,这种语言不应强迫程序员使用单一程序设计形式[20];就是说 C+
+语言应该是一种“多种花样”的语言。正是因为 Stroustrup 这种高瞻远瞩的构
想,才使得 C++逐渐发展成为一门最具综合性、用途最广泛的语言,受到世界
上最多的程序员喜爱。也正是因为同样的原因,人们在使用 C++的过程中,探
索出许多精巧优雅的编程技法,其中不少技法依赖着 C++本身丰富的特性,在
别种编程语言中并没有对应。例如伴随 C++的模板技术而衍生的各种各样的技
法,就能生动地说明这一点。
(一)C++ 模板元编程的发展
1994 年的一次 C++标准委员会的会议上,Erwin Unruh 提交了一个很特别
的 C++程序,这个程序能够产生一系列素数,但与普通程序最大的不同,运算
结果的产生是在编译期完成的,为了显示这些结果,甚至故意产生了一些编译
期的错误信息,也就是说,程序从未完成编译过程,却能得到结果[13]。过程
如此奇异,实际上是利用了 C++模板的可递归特性,或者称为“编译期递归”。
受此启发,Todd Veldhuizen 在 1995 年的一篇文章[27]中提出了“模板元编
程 ( Template Metaprogramming ) ” 这 个 概 念 ,不但指 出 模 板 的 特 化
(Specialization)能力可以用于针对编译期的编程,而且提出了几种实用的
控制分支结构。从此 C++的编程技术分出一门旁支,C++代码拥有的编译期
和运行期的两段执行能力受到人们关注。
Krzysztof Czarnecki 与 Ulrich W. Eisenecker 在 1999 年 出 版 了
《Generative Programming Methods, Tools, and Applications》一书,
这本书对模板元编程的贡献是实现了一个辅助库,提出了更完善的控制结构的
编写方法。
2004 年 出版的《 C++ Template Metaprogramming: Concepts, Tools,
and Techniques from Boost and Beyond》一书归纳了十年来模板元编程
的技术动向,成为第一本论述 C++模板元编程技术的的专著。
模板元编程尽管处于 C++程序设计的浪尖,仍然有不少 C++程序库的作者直
接或间接地利用它,甚至开发出专用于模板元编程的库,当中包括著名的
Boost、Loki 和 Blitz++等。其中 Boost 提供了 MPL(Meta-Programming
Library),用以辅助模板元编程,当中提出了许多极有创新性的概念。
目前模板元编程已经成为 C++语言的一项庞大的分支,并仍然在迅速发展。许
多 C++程序员都十分热衷于讨论这门技术,不断提出很多新颖的概念。
(二)C++模板元编程的概念
元编程(Metaprogramming)的前缀 meta-表示“处于较高发展状态”的意思,
从这个意义上讲,metaprogramming 指的就是高阶的编程,即编写一种程序,
使得这种程序可以把某些程序作为输入数据,生成或者操作其他的程序。一般
而言,这些高阶的程序运行在编译时。因此,元编程并非一个新概念,事实上
任何一种高级语言的编译器都可以视为元编程的工具,因为它们的程序必须被
转换为汇编语言或者机器语言以后,才能够运行在计算机上。Lex 和 Yacc 也是
很传统的元编程工具,它们能够把一种新的语言根据规范转换成对应的 C 语言
代码。
C++强大的模板机制赋予了模板在编译时的运算能力。例如以下的代码计算
n!,借助于模板的特化能力形成递归,所有运算都在编译时完成:
#include
template< unsigned n >
struct factorial
{
static const unsigned value = n * factorial < 0 > ::value;
};
template<>
struct factorial<0>
{
static const unsigned value = 1;
};
int main()
{
std::cout<<factorial < 6 > ::value<<std::endl; 6!="720
}
在这个例子里面,factorial 在传统意义上是一个类模板,但用元编程的观点去
看待,则可以认为是一个元函数(Metafunction)。这个元函数接受一个整型
的模板参数,它的返回值是元函数的一个静态成员。注意元函数与普通的函数
很不一样,一方面,元函数往往需要定义一个以上的特化版本作为终结条件,
另一方面,元函数的返回值需要显式地提取出来。
这个简单的程序似乎仅仅是玩弄技巧,但正如 1994 年 Erwin Unruh 所演示的
那个载入史册的素数生成程序,它们其实都只是引起人们注意的冰山一角,为
了深入研究模板元编程的能力、使用范围和局限性,必须清楚了解其背后的机
理。
模板元编程的原理
(一) 函数式编程
1.函数式编程的概念
从上面的例子可以看出,由于模板元编程借助的是 C++模板的特化能力,使它
的设计方法迥异于普通的 C++编程习惯。比如我们不能够在元函数中使用变量,
编译期显然只可能接受静态定义的常量,也就因此,我们不能够使用传统意义
上的循环;要实现任何分支选择,唯一的方法是调用其它元函数或者使用递归。
这 种 编 程 风 格 正 是 具 有 重 要 理 论 意 义 的 函 数 式 编 程 ( Functional
Programming)。
Kenneth C. Louden 指出函数式编程有如下的特点:
l 所有的过程都是函数,并且严格地区分输入值(参数)和输出值(结果)。
l 没有变量或赋值(变量被参数替代)。
l 没有循环(循环杯递归调用替代)。
l 函数的值只取决于它的参数的值而与求得参数值的先后或者调用函数的路径无
关。
l 函数是一类值。
上述的最后一点是一个很重要 的性质 。所谓 “函数是 一类值( First Class
Value)”指的是函数和值是同等的概念,一个函数可以作为另外一个函数的参
数,也可以作为值使用。如果函数可以作为一类值使用,那么我们就可以写出
一些函数,使得这些函数接受其它函数作为参数并返回另外一个函数。比如定
义了 f 和 g 两个函数,用 compose(f,g)的风格就可以生成另外一个函数,使得
这个函数执行 f(g(x))的操作,则可称 compose 为高阶函数(Higher-order
Function)。
2.函数式编程在 C++中的常用方法
如果排除上述的最后一点,那么 C 语言已经能完整模拟出函数式编程的风格,
但是在 C 语言中,函数却并不能作为一类值。也许我们会想到函数指针,但是
试想如果我们的函数需要返回另一个函数的指针:
typedef int(*IntProc) (int);
IntProc compose(IntProc f, IntProc g)
{
int tempProc(int x)
{
return f(g(x));
}
return tempProc;
}
这个例子是不能通过编译的,因为 C 语言禁止在函数中定义函数。
幸运的是,我们可以在 C++中利用类和模板来解决这个问题,因为 C++允许
定义()操作符,建立所谓的仿函数(Functor)。所以对象既可以作为值来
传递和调用,又可以像函数一样用 obj(x)的语法来使用了;另一方面,利用模
板对返回值的控制,就可以避免上面无法定义内部函数的矛盾了。例如在 GCC
的 STL 中有一个不属于 C++标准的 compose1 函数,可以接受两个定义了
()操作符的对象作为函数参数,并返回一个能进行 f(g(x))运算的对象:
template <class Operation1, class Operation2>
class unary_compose
: public unary_function<typename Operation2::argument_type,
typename Operation1::result_type> {
protected:
Operation1 op1;
剩余57页未读,继续阅读
suninf
- 粉丝: 5
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功