现在的位置: 首页 > 综合 > 正文

模板元编程入门详解

2013年09月22日 ⁄ 综合 ⁄ 共 1865字 ⁄ 字号 评论关闭

        引述:

当我们在程序中要用到一个需要计算出来的常数,但是又不想在程序中写表达式(因为影响程序速度),还不想用计算器先算出来再直接用结果,怎么办?答:可以考虑用define或const。例如我要用到一天有多少秒,我会定义宏(#define DAY_SEC 24*60*60) 或者定义常量(const unsigned day_sec=24*60*60;),这样我在程序中直接用DAY_SEC或day_sec就行了,编译器会提前替我计算出来的。但是,我要用到斐波纳契数列第N项常量,我要用到整数N的平方根常量,... ,怎么办?答:可以考虑用TMP。

参考:

#include <iostream>
using namespace std;

template<unsigned n>
struct Factorial {
  enum {value = n * Factorial<n-1>::value};
};

template<>
struct Factorial<0> {
  enum {value = 1}; 
};

int main() {
  cout << Factorial<10>::value << endl;
  return 0;
}

解释:

历史:

1994年,在圣迭哥举行的一次C++标准委员会会议期间,Erwin Unruh展示了一段特别的代码,可以在编译期以编译错误信息的方式产生从2到某个给定值之间的所有质数。同年夏天,Todd Veldhuizen受Erwin的例子启发,发现可以使用C++模板进行元编程(metaprogramming),并发表了一份技术报告。次年5月又在C++ Report上发表了一篇名为“Using C++ template metaprograms”的文章,从而将Erwin Unruh发现的C++编译期模板编程(Compile-time
Template Programming)进一步精化为C++模板元编程(Template Metaprogramming,TMP)。

       思想:

利用模板特化机制实现编译期条件选择结构,利用递归模板实现编译期循环结构,模板元程序则由编译器在编译期解释执行。

模板元编程使用静态C++语言成分,编程风格类似于函数式编程,其中不可以使用变量、赋值语句和迭代结构等。在模板元编程中,主要操作整型(包括布尔类型、字符类型、整数类型)常量和类型。被操纵的实体也称为元数据(Metadata。所有元数据均可作为模板参数。由于在模板元编程中不可以使用变量,我们只能使用typedef名字和整型常量。它们分别采用一个类型和整数值进行初始化,之后不能再赋予新的类型或数值。如果需要新的类型或数值,必须引入新的typedef名字或常量。

资源:

[1] Todd Veldhuizen,TemplateMetaprograms ,http://osl.iu.edu/~tveldhui/papers/Template-Metaprograms/meta-art.html

[2] Todd Veldhuizen,Expression Templates, http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html

[3] Todd Veldhuizen,C++ templates as partial evaluation,http://osl.iu.edu/~tveldhui/papers/pepm99/. 

[4] Todd Veldhuizen,Scientific Computing: C++ versusFortran ,http://osl.iu.edu/~tveldhui/papers/DrDobbs2/drdobbs2.html

[5] Erwin Unruh, Prime numbers(Primzahlen - Original),http://www.erwin-unruh.de/primorig.html . 

[6] Erwin Unruh, Prime numbers(Primzahlen),http://www.erwin-unruh.de/Prim.html . 

[7] Edward Rosten,Floating point arithmetic in C++ templateshttp://mi.eng.cam.ac.uk/~er258/code/fp_template.html

部分参考:http://blacfun.blog.163.com/blog/static/2484748120084173259314/

抱歉!评论已关闭.