您现在的位置: 天极网 > 开发频道 > C++模板元编程技术研究
全文

C++模板元编程技术研究

2004-01-06 17:14作者:ADJS出处:论坛责任编辑:方舟
  一个可以运行的模板元编程例子

  模板元编程(Template Metaprogramming)更准确的含义应该是“编‘可以编程序的’程序”,而模板元程序(Template Metaprogram)则是“‘可以编程序的’程序”。也就是说,我们给出代码的产生规则,编译器在编译期解释这些规则并生成新代码来实现我们预期的功能。

  Erwin Unruh的那段经典代码并没有执行,它只是以编译出错信息的方式输出中间计算结果。让我们来看一个可以运行的模板元编程例子 — 计算给定整数的指定次方:

// xy.h

//原始摸板
template<int Base, int Exponent>
class XY
{
public:
enum { result_ = Base * XY<Base, Exponent-1>::result_ };
};

//用于终结递归的局部特化版
template<int Base>
class XY<Base, 0>
{
public:
enum { result_ = 1 };
};

  模板元编程技术之根本在于递归模板实例化。第一个模板实现了一般情况下的递归规则。当用一对整数<X, Y>来实例化模板时,模板XY<X, Y>需要计算其result_的值,将同一模板中针对<X, Y-1>实例化所得结果乘以X即可。第二个模板是一个局部特化版本,用于终结递归。

  让我们看看使用此模板来计算5^4 (通过实例化XY<5, 4>)时发生了什么:

// xytest.cpp

#include <iostream>
#include "xy.h"

int main()
{
std::cout << "X^Y<5, 4>::result_ = " << XY<5, 4>::result_;
}

  首先,编译器实例化XY<5, 4>,它的result_为5 * XY<5, 3>::result_,如此一来,又需要针对<5, 3>实例化同样的模板,后者又实例化XY<5, 2>…… 当实例化到XY<5, 0>的时候,result_的值被计算为1,至此递归结束。

  递归模板实例化的深度和终结条件

  可以想象,如果我们以非常大的Y值来实例化类模板XY,那肯定会占用大量的编译器资源甚至会迅速耗尽可用资源(在计算结果溢出之前),因此,在实践中我们应该有节制地使用模板元编程技术。

  虽然 C++标准建议的最小实例化深度只有17层,然而大多数编译器都能够处理至少几十层,有些编译器允许实例化至数百层,更有一些可达数千层,直至资源耗尽。

  假如我们拿掉XY模板局部特化版本,情况会如何?

// xy2.h

//原始摸板
template<int Base, int Exponent>
class XY
{
public:
enum { result_ = Base * XY<Base, Exponent-1>::result_ };
};

  测试程序不变:

// xytest2.cpp

#include <iostream>
#include "xy2.h"

int main()
{
std::cout << "X^Y<5, 4>::result_ = " << XY<5, 4>::result_;
}

  执行如下编译命令:

C:\>g++ -c xytest2.cpp

  你将会看到递归实例化将一直进行下去,直到达到编译器的极限。

  GNU C++ (MinGW Special) 3.2的默认实例化极限深度为500层,你也可以手工调整实例化深度:

C:\>g++ -ftemplate-depth-3400 -c xytest2.cpp

  事实上,就本例而言,g++ 3.2允许的实例化极限深度还可以再大一些(我的测试结果是不超过3450层)。

  因此,在使用模板元编程技术时,我们总是要给出原始模板的特化版(局部特化版或完全特化版或兼而有之),以作为递归模板实例化的终结准则。

共5页。 9 1 2 3 4 5 :

软件资讯·软件下载尽在天极软件

相关搜索:
相关文章及软件
关注此文读者还看过
热门关注
特别推荐
网友关注
软件下载
娱乐下载
驱动下载
文章排行
本周
本月
最近更新
关于我们|About us|网站律师|天极服务|电子杂志|RSS订阅|加入我们|网站地图
TMG
Copyright (C) 1999-2009 Chinabyte.com, All Rights Reserved 版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868
版权声明 在线提交意见反馈 渝ICP证B2-20030003号
经营性网站备案信息 网警备案 中国网站排名
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众