引述:
當我們在程式中要用到乙個需要計算出來的常數,但是又不想在程式中寫表示式(因為影響程式速度),還不想用計算器先算出來再直接用結果,怎麼辦?答:可以考慮用define或const。例如我要用到一天有多少秒,我會定義巨集(#define day_sec 24*60*60) 或者定義常量(const unsigned day_sec=24*60*60;),這樣我在程式中直接用day_sec或day_sec就行了,編譯器會提前替我計算出來的。但是,我要用到斐波納契數列第n項常量,我要用到整數n的平方根常量,... ,怎麼辦?答:可以考慮用tmp。
參考:
#include using namespace std;
templatestruct factorial ;
};template<>
struct factorial<0> ;
};int main()
解釋:
歷史:
2023年,在聖迭哥舉行的一次c++標準委員會會議期間,erwin unruh展示了一段特別的**,可以在編譯期以編譯錯誤資訊的方式產生從2到某個給定值之間的所有質數。同年夏天,todd veldhuizen受erwin的例子啟發,發現可以使用c++模板進行元程式設計(metaprogramming),並發表了乙份技術報告。次年5月又在c++ report上發表了一篇名為「using c++ template metaprograms」的文章,從而將erwin unruh發現的c++編譯期模板程式設計(compile-time template programming)進一步精化為c++模板元程式設計(template metaprogramming,tmp)。
思想:
利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構,模板元程式則由編譯器在編譯期解釋執行。
模板元程式設計使用靜態
c++語言成分,程式設計風格類似於
函式式程式設計
,其中不可以使用變數、賦值語句和迭代結構等。
在模板元程式設計中,主要操作整型(包括布林型別、字元型別、整數型別)常量和型別。
被操縱的實體也稱為元資料(
metadata
)。所有元資料均可作為模板引數。
由於在模板元程式設計中不可以使用變數,我們只能使用
typedef
名字和整型常量。它們分別採用乙個型別和整數值進行初始化,之後不能再賦予新的型別或數值。如果需要新的型別或數值,必須引入新的
typedef
名字或常量。
資源:
部分參考:
C 模板元程式設計 入門簡介
範例引入 主模板template struct fib 完全特化版 template struct fib 1 完全特化版 template struct fib 0 int main 主要思想 利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構,模板元程式則由編譯器在編譯期解釋...
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...