這兩周學習了《
c++ tmp》第
五、六章,是關於tmp的序列(容器)、迭代器和演算法。做了不少習題,其中最有意思的(也是花了我最多時間的)習題是用tmp實現二分查詢樹(binary search tree)。
從第五章的一道關於二分樹的習題開始。題目給出乙個編譯期的二分樹資料結構,例如:
typedef tree< // double
double // / /
, tree// void* char
, char // / /
> tree_seq; // int long要求實現對該二分樹的前序、中序、後序遍歷,即滿足:
boost_static_assert(( mpl::equal<
preorder_view
, mpl::vector
, boost::is_same<_1,_2>
>::value ));
boost_static_assert(( mpl::equal<
inorder_view
, mpl::vector
, boost::is_same<_1,_2>
>::value ));
boost_static_assert(( mpl::equal<
postorder_view
, mpl::vector
, boost::is_same<_1,_2>
>::value ));其實這三種遍歷是很相似的,實現了其中乙個,另兩個就可以照著寫了。所以我們先從
preorder_view開始著手。
當然,最開始還是要先定義
tree,如下:
template
struct tree
;
其中 type的定義是為了滿足boost::mpl的慣例,其餘三個定義顯而易見,是為了可以方便地取出tree類的根、左子樹和右子樹。接著,我們來看看如何實現preorder_view。從題目給出的測試**可知,preorder_view的呼叫結果應該是類似於mpl::vector<>的乙個序列,裡面是按前序的方式對tree進行遍歷所得到的元素。所以,我乾脆就用mpl::vector<>來作為preorder_view的呼叫結果,先寫出主模板的初稿:
template
struct preorder_view : mpl::vector
;
再針對 tree<>類進行偏特化,如下:
template
struct preorder_view< tree>
;
這段**是按照前序的方式來實現,即先訪問根元素,然後以前序方式訪問左子樹,再以前序方式訪問右子樹。這個偏特化版本與主模板一道,就可以實現前序遍歷了。相似地,我們可以寫出
inorder_view和postorder_view,如下:
template
struct inorder_view : mpl::vector
;
template
struct inorder_view< tree>
;
template
struct postorder_view : mpl::vector
;
template
struct postorder_view< tree>
;
最後是測試**:
int main()
應該說,這個開頭還是比較容易的,不過後面就有點難度了。
學習C 模板元程式設計(6)
接下來是第六章的一道習題,要求實現乙個 binary tree inserter,以使用mpl copy演算法從其它序列生成一棵二分查詢樹 binary search tree,即滿足以下條件的一種二分樹 左子樹所有元素小於根,右子樹所有元素大於根,且左右子樹全都是二分查詢樹 習題中給出的測試 如下...
C 模板元程式設計
原理 模板元程式由編譯器在編譯期解釋執行,利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構。模板元程式設計 metaprogramming 意思是,程式設計系統將會執行我們所寫的 來生成新的 而這些新 才真正實現了我們所期望的功能。元程式設計最大的特點在於 某些使用者自定義的計...
C 模板元程式設計
昨天wl發給我一段我覺得很 奇怪 的c 當時沒看太懂,後來問了才知道是叫做模板元程式設計。template struct binary template specialization struct binary 0 terminates recursion 覺得很新奇,於是乎索要了一本電子書,名為 ...