範例引入
//主要思想主模板template
struct
fib;
};//
完全特化版
template <>
struct fib<1>;
};//
完全特化版
template <>
struct fib<0>;
};int
main()
利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構,模板元程式則由編譯器在編譯期解釋執行。
優劣及適用情況
通過將計算從執行期轉移至編譯期,在結果程式啟動之前做盡可能多的工作,最終獲得速度更快的程式。也就是說模板元程式設計的優勢在於:
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,則**可以通過編譯,否則編譯報錯。
技術細節
模板元程式設計使用靜態c++語言成分,程式設計風格類似於函式式程式設計,在模板元程式設計中,主要操作整型(包括布林型別、字元型別、整數型別)常量和型別,不可以使用變數、賦值語句和迭代結構等。被操縱的實體也稱為元資料(metadata),所有元資料均可作為模板引數。
由於在模板元程式設計中不可以使用變數,我們只能使用typedef名字和整型常量。它們分別採用乙個型別和整數值進行初始化,之後不能再賦予新的型別或數值。如果需要新的型別或數值,必須引入新的typedef名字或常量。
其它範例
//僅宣告struct
nil;
//主模板
template struct
ispointer
; typedef nil valuetype;
};//
區域性特化
template struct ispointer;
typedef t valuetype;
};//
示例int
main()
//主模板template
struct
staticassert;
//完全特化
template<>
struct staticassert{};
//輔助巨集
#define static_assert(exp)\
intmain()
C 模板元程式設計 入門簡介
最近一直在看stl和boost,原始碼裡邊好多涉及到模板元程式設計技術,簡單了解一下,備忘 boost python中的涉及模板元的部分重點關注一下 範例引入 主模板template struct fib 完全特化版 template struct fib 1 完全特化版 template stru...
C 模板元程式設計 入門簡介
最近一直在看stl和boost,原始碼裡邊好多涉及到模板元程式設計技術,簡單了解一下,備忘 boost python中的涉及模板元的部分重點關注一下 範例引入 主模板template struct fib 完全特化版 template struct fib 1 完全特化版 template stru...
模板元程式設計入門詳解
引述 當我們在程式中要用到乙個需要計算出來的常數,但是又不想在程式中寫表示式 因為影響程式速度 還不想用計算器先算出來再直接用結果,怎麼辦?答 可以考慮用define或const。例如我要用到一天有多少秒,我會定義巨集 define day sec 24 60 60 或者定義常量 const uns...