模板元程式設計入門詳解

2021-06-05 21:25:22 字數 1980 閱讀 4469

引述:

當我們在程式中要用到乙個需要計算出來的常數,但是又不想在程式中寫表示式(因為影響程式速度),還不想用計算器先算出來再直接用結果,怎麼辦?答:可以考慮用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...