做爲模板部分的結束節,本條款談到了模板元編程,元編程本質上就是將運行期的代價轉移到編譯期,它利用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可被用來生成「基於政策選擇組合」的客戶定製代碼,也能夠用來避免生成對某些特殊類型並不適合的代碼。(這句話看不懂也不要緊)