主要思想:利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構,模板元程式則由編譯器在編譯期解釋執行。
優劣及適用情況:
通過將計算從運行期轉移至編譯期,在結果程式啟動之前做儘可能多的工作,最終獲得速度更快的程式。也就是說模板元編程的
優勢在於:
1.以編譯耗時為代價換來卓越的運行期效能(一般用於為效能要求嚴格的數值計算換取更高的效能)。通常來說,一個有意義的程式的運行次數(或服役時間)總是遠遠超過編譯次數(或編譯時間)。
2.提供編譯期類型計算,通常這才是模板元編程大放異彩的地方。
模板元編程技術並非都是優點:
1.代碼可讀性差,以類模板的方式描述演算法也許有點抽象。
2.調試困難,元程式執行於編譯期,沒有用於單步跟蹤元程式執行的調試器(用於設定斷點、察看資料等)。程式員可做的只能是等待編譯過程失敗,然後人工破譯編譯器傾瀉到螢幕上的錯誤資訊。
3.編譯時間長,通常帶有模板元程式的程式產生的程式碼尺寸要比普通程式的大,
4.可移植性較差,對於模板元編程使用的進階模板特性,不同的編譯器的支援度不同。
總結:模板元編程技術不適用普通程式員的日常應用,它常常會做為類庫開發的提供支援人員,為常規模板代碼的核心的關鍵演算法實現更好的效能或者編譯期類型計算。模板元程式幾乎總是應該與常規代碼結合使用被封裝在一個程式庫的內部。對於庫的使用者來說,它應該是透明的。
工程應用執行個體
1. Blitz++:由於模板元編程最先是因為數值計算而被發現的,因此早期的研究工作主要集中於數值計算方面,Blitz++庫利用模板將運行期計算轉移至編譯期的庫,主要提供了對向量、矩陣等進行處理的線性代數計算。
2.Loki:將模板元編程在類型計算方面的威力應用於設計模式領域,利用元編程(以及其他一些重要的設計技術)實現了一些常見的設計模式之泛型版本。Loki庫中的Abstract Factory泛型模式即藉助於這種機制實現在不損失型別安全的前提下降低對類型的靜態依賴性。
3.Boost:元編程庫目前主要包含MPL、Type Traits和Static Assert等庫。 Static Assert和Type Traits用作MPL的基礎。Boost Type Traits庫包含一系列traits類,用於萃取C++類型特徵。另外還包含了一些轉換traits(例如移除一個類型的const修飾符等)。Boost Static Assert庫用於編譯期斷言,如果評估的運算式編譯時間計算結果為true,則代碼可以通過編譯,否則編譯報錯。