本文屬spanzhang原創,其blog位址為:http://blog.csdn.***/spanzhang。引用或轉貼請註明出處,謝謝!!
c++ meta programming基本上都是用template來做,它是generic programming的一種。個人認為這個東西在實際的開發中不是特別有用,至少我還沒有實際用過。tml(type manipunation library)是作者開發的乙個c++ meta programming庫,它是純粹為研究目的而寫的。如果你看了**不頭暈,說明你心理抵抗力比較強!在tml中,所有的**都執行在編譯期,它只對型別做操作而不對資料做操作。在整體結構上和standard template library (stl)相似,所不同的是tml將型別放入容器中進行操縱而stl將資料放入容器中進行操縱。當然,我這個小玩意還沒有完全成型,就算成型了也不可能與stl相提並論。下面先從原理上來進入tml正題:
1、靈感**(tml的基礎)
看看下面的乙個模板類:
template
class somename
;這個類有兩個模板引數,在內部公共域僅提供了乙個型別定義。我們將它翻譯成如下格式:
meta_parameters
meta_function somename
;這樣,原來的模板引數變成了函式引數,原來的類名somename變成了函式名,原來的類定義變成了函式體,以前的類私有域變成了函式執行運算的部分而公共域成了函式的返回部分。這樣以來,我們可以做如下的定義(或者,現在應該叫運算才對):
meta_var somename::return clsresult;
這個語句不會在執行期產生任何記憶體分配行為,而對於編譯期來將將生成了乙個新的型別。ok,tml的基本東西就這麼多了。如下的一些巨集構成了tml的基礎部分:
#define meta_equal_to :public
#define meta_is :public
#define meta_function class
#define meta_parameters template
#define meta_return public
#define meta_var typedef
#define meta_param typename
#define meta_const(name,value) enum ;
2、語句、運算和迴圈
tml的語句相對來說簡單得多,乙個最基本條件判斷語句如下:
meta_parameters
meta_function if
;meta_function select;
meta_return:
meta_var select::ret ret;
};實現的時候是通過乙個巢狀類select的特化來完成判斷操作。另外,說一句題外題內話,tml的所有返回都叫ret而不叫return是因為寫起來麻煩。
tml也有一些運算子,比如:
meta_parameters
meta_function or meta_is unary_function;};
我估計,你看到這段**後根本就不知道它原來就是邏輯運算子or的實現。其它的一些運算符號以後介紹。接下來乙個比較頭痛的事情是迴圈。在tml裡,所有的迴圈都是通過型別迭代來完成的,什麼是型別迭代,哎,我都崗不清楚,只可意會。看下面的例子:
meta_parameters
meta_function push_front
{meta_var maplist::next nextmap;
meta_var maplist::value value;
meta_var maplist::tag tag;
meta_var maplist::prior_tag prior_tag;
meta_var nextmap::tag nexttag;
c 模版元程式設計
編譯時計算階乘 includeusing namespace std templateclass factorial template class factorial 1 int main 編譯時展開迴圈 includeusing namespace std templateclass loop t...
C 模板元程式設計
原理 模板元程式由編譯器在編譯期解釋執行,利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構。模板元程式設計 metaprogramming 意思是,程式設計系統將會執行我們所寫的 來生成新的 而這些新 才真正實現了我們所期望的功能。元程式設計最大的特點在於 某些使用者自定義的計...
C 模板元程式設計
昨天wl發給我一段我覺得很 奇怪 的c 當時沒看太懂,後來問了才知道是叫做模板元程式設計。template struct binary template specialization struct binary 0 terminates recursion 覺得很新奇,於是乎索要了一本電子書,名為 ...