Template metaprogramming(TMP,模板元编程)是编写template-based C++程序并执行于编译期的过程。
TMP的优点:1.让某些事更容易
2.将工作从运行期转移到编译期,使得错误在编译期就能找出来
3.高效,较小的可执行文件、较短的运行期、较少的内存需求
缺点:使编译时间变长
书上TMP的例子,在编译期计算阶乘,通过递归模板具现化
template<unsigned n>
struct Factorial
{
enum{
value = n*Factorial<n-1>::value
};
};
template<>
struct Factorial<0>
{
enum{value=1};
};
int main()
{
std::cout << Factorial<5>::value<< std::endl;
std::cout << Factorial<10>::value << std::endl;
return 0;
}
循环发生在templates具现体Factorial<n>内部指涉另一个template具现体Factorial<n-1>之时。和所有良好的递归一样,我们需要一个特殊的情况造成递归结束,这里的特殊情况是template特化体Factorial<0>.
每个Factorial template具现体都是一个struct,每个struct都使用enum hack 声明一个名为value的TMP变量,value用来保存当前计算所得的阶乘值。如果TMP拥有真正的循环构件,value应该在每次循环内获得更新。但由于TMP是以递归模板具现化取代循环,每个具现体有自己的一份value,而每个value有其循环的的适当值。
请记住
1.Template metaprogrammint(TMP,模板元编程)可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率
2.TMP可被用来生成“基于政策选择组合”的客户定制代码,也可用来避免生成对某些特殊类型并不合适的代码