最近看到之前自己寫過的乙個小東西,可以作為模板元程式設計的開篇案例,所以就打算寫一系列的文章來講述一下c++中的模板元程式設計
模板元程式設計對於資深的c++程式設計師可能並不陌生,特別是用gcc做c++程式開發的,因為可以說gcc這個編譯器是實現c++11標準的最全的編譯器。不說題外話了,先介紹一下模板元程式設計,所謂模板元程式設計,就是使用c++的模板特性,來進行靜態化的程式設計,而我們接觸模板元程式設計的最多的地方就是使用的stl,boost等模板庫。
說這麼多,對於不知道模板元程式設計的朋友來說可能還是不太清楚到底是個什麼東西,下面就乙個例子給大家講解一下。
可能大家都寫過素數的判斷,以及計算素數的程式,當然這個程式不使用模板元程式設計來實現是很簡單的,但今天想給大家使用模板元程式設計來實現乙個計算素數的程式。
int _tmain(int argc, _tchar* argv)
看到上面的主函式,我想也就明白了到底是要做什麼,今天先介紹isprime的實現,prime的實現,就不介紹了
templatestruct isprime
;template<>
struct isprime<1>
;template<>
struct isprime<2>
;
我們先得定義這個isprime的模板函式,其中1得定義為不是素數,2定義為是素數,下面關鍵在於test的實現,這個test元函式是用來實現n%m計算的,其中m是遞增的
templatestruct test
;templatestruct test;
templatestruct test<0, m>
;
這裡定義了test模板元函式的實現,看到偏特化test和test<0, m>的定義,這兩個偏特化其實就是定義了二元的元函式最終執行的結束條件,而上面的未偏特化的模板test則定義了乙個遞迴,可以看到test模板內的result的值又繼續是test模板例項中的值,那麼關鍵在於next和nextm的定義了
templatestruct nextn
;templatestruct nextm
;
看到nextm的定義,就是當m*m<=n的時候將value置為m+1,否則value就為0。nextn就是對於n%m進行計算,如果是0,則說明是n有正整數因子,那麼就不為素數,否則nextn中的value值繼續為n
回到test看,遞迴定義的test會計算從m到n的平方根的正整數是否是n的正整數因子,如果是,則test會進入到偏特化test<0, m>,那麼結果就為false,否則計算到nextm中value為0,也就是m到等於n的平方根時,依然沒有結束這個test遞迴,那麼就會進入到test偏特化,結果為true。
經過上面的介紹,我想剛接觸模板元程式設計的朋友可能會有些不明所以,覺得比直接用c++來實現麻煩了太多太多,那也的確是,但是對於一些朋友想使用編譯器威力來提公升自己的**嚴謹性和高效性的,模板元程式設計無疑是個非常好的選擇。
模板 模板元程式設計
將進行型別引數代替作為一種方便的方法,這意味著產生了一種支援編譯時程式設計的機制,這樣的程式稱為模板元程式 template metaprogram 因為正在 為乙個程式進行程式設計 事實證明可以用它做很多事情。實際上,模板元程式設計就是完全的圖靈機 turing complete 因為它支援選擇 ...
模板元程式設計
類是對物件的抽象,類模板則是對類的抽象 抽象是為提供更強的表達能力,還有統一 一致性 在更高的抽象觀點上來看,型別和值是同一種東西,同樣可以計算。模板可以看作是一種更智慧型的巨集,為了在使用時的一致性,使用了許多的技巧。現代的程式語言,要麼為了效率,把以前執行時的工作拿到編譯期。要麼為了更大的自由度...
模板元程式設計
模板元程式設計 遊戲開發中實現遞迴,使得編譯時期長,執行速度快。詳細介紹 include 模板元吧執行時消耗的時間,在編譯期間優化 templatestruct data template struct data 1 template struct data 2 1 1 2 3 5 7 int ge...