C 模板元程式設計

2021-07-26 21:53:43 字數 2264 閱讀 1145

原理:模板元程式由編譯器在編譯期解釋執行,利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構。

模板元程式設計(metaprogramming)意思是,程式設計系統將會執行我們所寫的**,來生成新的**,而這些新**才真正實現了我們所期望的功能。元程式設計最大的特點在於:某些使用者自定義的計算可以在編譯期進行,二者通常能夠在效能和介面簡單性方面帶來好處。

1. 利用模板特化機制實現編譯期條件選擇結構

首先了解一下類模板的特化。類模板特化是指將模板引數指定為某一種型別,你必須在起始處宣告乙個template<>,接下來宣告用來特化模板的型別。這個型別被用作模板實參,且必須在類名後面直接指定:

templateclass

stackspecialize

;template

<>

class stackspecializestring>;

另外乙個比較重要的概念是偏特化(partial specialization),意思是如果class template擁有乙個以上的template引數,可以針對其中某個(或數個,但非全部)template引數進行特化工作。(另一種解釋是針對任何template引數更進一步的條件限制所設計出來的乙個特化版本)。

回到模板元程式設計,如下求斐波那契數列的元程式設計**:

#include "

stdafx.h

"#include

using

namespace

std;

//主模板

template

struct

fib;

};//

特化模板必須在主模板之後

//完全特化版,處理n=1的情況

template<>

struct fib<1>;

};//

完全特化版,處理n=0的情況

template<>

struct fib<0>;

};int _tmain(int argc, _tchar*argv)

上述程式編譯時,會進行遞迴例項化,為了計算fib<500>的enum result的值,會例項化fib<499>和fib<498>,如此遞迴下去。程式中給出了當n=1和n=0的情況,程式例項化到fib<1>和fib<0>時,完全特化版被例項化,遞迴結束。模板例項化通常要消耗巨大的編譯器資源,c++標準建議最多隻進行17層遞迴例項化,上述程式vs下可以正常編譯,但vs最多支援500次,501次即報錯:error 1 error c1202: recursive type or function dependency context too complex。

上述數列在計算時使用的是模板的特化機制實現條件選擇結構,還有比如在求最大值的函式中,使用(表示式a?表示式b:表示式c)來實現分支選擇,像這種?:符號,編譯器在例項化時,不僅例項化表示式b分支,表示式c分支也會例項化。這樣造成的乙個問題是遞迴次數的增加,但vs和gcc遞迴的次數是有限的,所以必須限制例項化數量,使其不至過於龐大。typedef就是乙個解決方法,為乙個類模板定義乙個typedef並不會導致c++編譯器例項化該例項的實體。

//

基礎模板:根據第1個實參,來確定是使用第2個實參,還是第3個實參

template

class

ifthenelse;

//區域性特化

templateclass ifthenelse;

//區域性特化

templateclass ifthenelse;

2. 利用遞迴模板實現編譯期迴圈結構

以兩個向量的點乘為例,比較直觀的解決的解決方法當然是維度為迴圈次數,依次相加相乘。使用元程式設計編寫基本模板後,再編寫作為結束條件的區域性特化版本,就可以使用元程式設計實現迴圈結構了。

元程式設計的意義不只是編譯期的數值計算,因為元程式設計的輸入的資料必須是已知的,如果程式執行時輸入的資料動態變化,那麼元程式設計就無能為力了。問題在於,如果不是純數值計算,輸入的資料都是未知的。元程式設計還可以用來進行**生成,編譯期斷言,型別計算等。qt就用到**生成,它將源**交給標準編譯器之前,需要事先將使用 moc (meta-object compiler,「元物件編譯器」)分析 c++ 原始檔。如果它發現在乙個標頭檔案中包含了巨集 q_object,則會生成另外乙個 c++ 原始檔。這個原始檔中包含了 q_object 巨集的實現**。這個新的檔案名字將會是原檔名前面加上 moc_ 構成。這個新的檔案同樣將進入編譯系統,最終被鏈結到二進位制**中去。

C 模板元程式設計

昨天wl發給我一段我覺得很 奇怪 的c 當時沒看太懂,後來問了才知道是叫做模板元程式設計。template struct binary template specialization struct binary 0 terminates recursion 覺得很新奇,於是乎索要了一本電子書,名為 ...

C 之模板元程式設計

關於模板原程式設計知識強烈推薦 非常好!首先複述一下模板元程式設計,以下標紅或者加粗的地方是模板元程式設計的精髓 從程式設計范型 programming paradigm 上來說,c 模板是 函式式程式設計 functional programming 它的主要特點是 函式呼叫不產生任何 沒有可變的...

模板 模板元程式設計

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