模板元程式設計

2021-07-02 19:29:57 字數 1135 閱讀 7282

類是對物件的抽象,類模板則是對類的抽象(抽象是為提供更強的表達能力,還有統一(一致性))。在更高的抽象觀點上來看,型別和值是同一種東西,同樣可以計算。模板可以看作是一種更智慧型的巨集,為了在使用時的一致性,使用了許多的技巧。現代的程式語言,要麼為了效率,把以前執行時的工作拿到編譯期。要麼為了更大的自由度,把以前編譯期的動作拿到執行期。

模板的特化可以看作是在編譯期執行的執行期的if else的條件判斷,而模板的遞迴巢狀則實現了迴圈的能力.

從程式設計正規化來看,c++ 元程式設計是函式式程式設計,從程式設計形式來看,模板的「<>」中的模板引數相當於函式呼叫的形參,例項化時傳入對應的實參,模板中的 typedef 或 static const 或 enum 定義函式返回值(型別或數值,數值僅支援整型,如果需要可以通過編碼計算浮點數),**計算是通過型別計算進而選擇型別的函式實現的(c++ 屬於靜態型別語言,編譯器對型別的操控能力很強)。

(插播:enum相當於定義了編譯期的整形常量,static,const變數的值也是在編譯期就確定的,注意c語言中不能用const 變數來表示陣列的維度,c++中才可以)。

在這裡總結一下c++中的enum的用法:

enum buttonrole;

buttonrole btnrole = acceptrole;

buttonrole是列舉型別,btnrole是對應的變數。invalidrole ,acceptrole,rejectrole是列舉量,相當於整形的符號常量。編譯器會隱式的將列舉量轉化為整形常量。

int i = btnrole 或者 int i= acceptrole;  不過反過來不行。

int j;  這樣判斷 if(j == rejectrole)

甚至可以進行算術運算: acceptrole * rejectrole

需要注意的是在類中巢狀定義的列舉型別,

class qmessagebox;};

此時使用時,需要指明在哪乙個域中。

int i = qmessagebox:: acceptrole

或者進行算術運算 qmessagebox::acceptrole + qmessagebox:: rejectrole

可以看到,enum 和 static的用法是很相似的,列舉量的用法和static型別的變數用法基本一樣。

模板 模板元程式設計

將進行型別引數代替作為一種方便的方法,這意味著產生了一種支援編譯時程式設計的機制,這樣的程式稱為模板元程式 template metaprogram 因為正在 為乙個程式進行程式設計 事實證明可以用它做很多事情。實際上,模板元程式設計就是完全的圖靈機 turing complete 因為它支援選擇 ...

模板元程式設計

模板元程式設計 遊戲開發中實現遞迴,使得編譯時期長,執行速度快。詳細介紹 include 模板元吧執行時消耗的時間,在編譯期間優化 templatestruct data template struct data 1 template struct data 2 1 1 2 3 5 7 int ge...

模板元程式設計 二

c 模板元程式設計是讓編譯器提前完成一些執行期的工作,這樣提高了程式的執行期速度。由編譯器完成,那些只能在編譯器做工作,可是在編譯器能使用的東西很少。模板機制是c 除了繼承之外的 重用的一項關鍵的機制,它在編譯器完成模板的例項化的特性滿足了能在編譯期做工作的基本條件。模板的特化和遞迴是元程式設計中的...