引述:
当我们在程序中要用到一个需要计算出来的常数,但是又不想在程序中写表达式(因为影响程序速度),还不想用计算器先算出来再直接用结果,怎么办?答:可以考虑用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/