做为模板部分的结束节,本条款谈到了模板元编程,元编程本质上就是将运行期的代价转移到编译期,它利用template编译生成C++源码,举下面阶乘例子:编程
1 template <int N> 2 struct Factorial 3 { 4 enum 5 { 6 value = N * Factorial<N - 1>::value 7 }; 8 }; 9 10 // 特化版本 11 template <> 12 struct Factorial<0> 13 { 14 enum 15 { 16 value = 1 17 }; 18 }; 19 20 int main() 21 { 22 cout << Factorial<5>::value << endl; // 输出120 23 }
在编译期,Factorial<5>::value就被翻译成了5 * 4 * 3 * 2 * 1,在运行期直接执行乘法便可。性能
元编程有何优势?spa
1. 以编译耗时为代价换来卓越的运行期性能,由于对于产品级的程序而言,运行的时长远大于编译时长。翻译
2. 将原来运行期才能发现的错误提早到了编译期,要知道,错误发现的越早,代价越小。debug
元编程有何缺点?调试
1. 代码可读性差,写起来要运用递归的思惟,很是困难。code
2. 调试困难,元程序执行于编译期,不能debug,只能观察编译器输出的error来定位错误。blog
3. 编译时间长,运行期的代价转嫁到编译期。递归
4. 可移植性较差,老的编译器几乎不支持模板或者支持极为有限。编译器
模板元编程TMP虽然有这么多的缺点,但它已经被证实是“图灵彻底”的了,意思是它的威力大到足以计算任何事物。目前boost库中用到了一些TMP技术,但大部分项目仍是由于TMP的一些缺点而没有普遍采用,因此这里咱们只要略作了解便可。
下面总结一下:
1. TMP可将工做由运行期转移到编译期,于是得以实现早期错误侦测或者更高的执行效率。
2. TMP可被用来生成“基于政策选择组合”的客户定制代码,也能够用来避免生成对某些特殊类型并不适合的代码。(这句话看不懂也不要紧)