1. 模板元編程(template mataprogramming,TMP)是編寫C++程序並執行於編譯期的過程,"所謂template mataprogram(模板元程序),是以C++寫成,執行於C++編譯器內的程序.一旦TMP程序結束執行,其輸出,也就是從templates具現出來的若干C++源碼,便會一如往常地被編譯".html
2. 自從templates加入C++,TMP底層特性便被引進了,自從TMP於1990s初期被發現,TMP被日漸證實十分有用.TMP有兩個偉大效力:編程
1). 它讓某些事情變得更容易.設計模式
2). template program執行於C++編譯期的特性使得工做能夠從編譯期轉移至執行期,這使得錯誤能夠被提早檢測,併產出具備較小可執行文件,較短運行期,較少內存需求的文件,代價就是編譯時間變長了.ide
條款47中的traits解法就是TMP,由於traits引起編譯期發生於類型身上的if...else運算:用編譯期的重載模板函數參數匹配行爲代替執行期發生的if...else運算功能.函數
TMP已經被證實是"圖靈徹底"的,使用TMP能夠聲明變量,執行循環,編寫及調用函數......針對TMP設計的程序庫(例如Boost's MPL)提供更高層次的語法."但這般構件相對於正常的C++對應物看起來非常不一樣,例如條款47展現的TMP if-else條件句是藉由templates及其特化體表現出來",另一個例子是循環,TMP是的循環是藉由遞歸完成:工具
用TMP實現一個計算階乘的函數以下.優化
template<unsigned n> struct Factorial{ enum{value=n*Factiroal<n-1>::value;}; } template<> struct Factorial<0>{ enum{ value=1}; }
正如以上所展現,TMP的遞歸併不涉及函數調用,而是遞歸模板具現化.spa
3. TMP的重要應用:設計
1) 確保量度單位正確code
2) 優化矩陣運算.
3) 生成客戶定製之設計模式實現品(如Strategy(條款35),Observer,Visitor等).
TMP當前也有其劣勢:語法不直觀,支持工具不充分,並且因爲TMP是在一個相對短期以前才之外發現的語言,其編程方式還須要依賴經驗......儘管如此,TMP帶來的效率改善仍然引人注目,C++對TMP的支持可能也會愈來愈多.