模板元程式設計 用 MPL 解決實際問題

2021-04-16 07:56:08 字數 2665 閱讀 9539

在 stl 中有各種容器,而 stl 演算法允許我們對容器中的元素做各種操作,下面的程式對於每乙個當代的 c++ 程式設計師都應該是輕而易舉的:

#include

#include

#include

#include

using namespace std;

struct print

};

int main()

執行結果:

world

hello

hello

world

簡單的東西往往能說明深刻的道理,在這個程式裡,我們遇到的本質問題是什麼?首先,我們有乙個容器;其次,我們可以往容器裡面放東西,最後,我們可以通過演算法把乙個操作施加於這個容器中的每乙個(也可以是部分)元素中。這就是上面程式中凝結的本質問題。

mpl 可以看成是 stl 的編譯期版本,或者說元程式設計版本。它同樣也提供了各種容器,只不過容納的物件不是資料,而是型別。它們的構造方式語法上比較類似,或者甚至,我以為,更有趣一點:

#include

#include

#include

#include

#include

using namespace boost;

int main()

稍微解釋一下。mpl::list 就是 std::list 的元程式設計版本,而 mpl::push_front 是什麼就不用我說了。mpl::at_c 是乙個元程式設計演算法,作用相當於執行期的 [ ] 運算子,也就是得到乙個容器中在某個位置上的元素。在 vc7.1 下面,執行結果是

class std::basic_string

,class std::allocator

>

intintclass std::basic_string

,class std::allocator

>

這跟執行期的 list 的行為幾乎完全一致。

當然,mpl 也有 for_each ,而且我們也可以為 for_each 提供乙個元程式設計 functor 。什麼是元程式設計 functor ?執行時的 functor 是乙個提供了 operator() 過載的 struct ,而元程式設計 functor 就是乙個提供了 operator() 模板的 struct :

#include

#include

#include

#include

#include

#include

using namespace boost;

struct print

};int main()

輸出與上面使用 mpl::at_c 的程式完全相同。

當然,到現在為止,這些程式都還是只停留在純粹的玩具程式上,能不能做點稍微有用的事情呢?當然可以。假定我們有這樣乙個繼承體系:根是乙個抽象類 product ,它有一些派生類,例如 pc , printer 等等,它們的公共方法 serialno 會返回自己的產品序列號,而這個序列號是在構造的時候決定的:

class product

;class pc : public product

std::string serialno()const

private:

std::string sn_;

};class printer : public product

std::string serialno()const

private:

std::string sn_;

};用 mpl::list 把這些型別放在同乙個 list 裡面當然不在話下,但是我們希望有乙個類似 factory 模式的實現,讓我們可以自由建立它們。下面的程式用 mpl::for_each 為 list 中的每乙個型別建立乙個例項,它當然可以被擴充套件來做些很有用的事情。

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace boost;

class product

;class pc : public product

std::string serialno()const

private:

std::string sn_;

};class printer : public product

std::string serialno()const

private:

std::string sn_;

};struct print

};// 由於 pc 和 print 都沒有預設的 constructor ,必須加上這個

template

struct wrap {};

struct create

template

void operator()(wrap

)std::string line_;

unsigned long serial_;

};int main()

輸出:type: class printer serialno: line1_0

type: class pc serialno: line1_1

模板元程式設計 用 MPL 解決實際問題

在 stl 中有各種容器,而 stl 演算法允許我們對容器中的元素做各種操作,下面的程式對於每乙個當代的 c 程式設計師都應該是輕而易舉的 include include include include using namespace std struct print int main 執行結果 w...

模板元程式設計 用 MPL 解決實際問題

在 stl 中有各種容器,而 stl 演算法允許我們對容器中的元素做各種操作,下面的程式對於每乙個當代的 c 程式設計師都應該是輕而易舉的 include include include include using namespace std struct print int main 執行結果 w...

用程式設計解決實際問題

在現實程式設計中,如果我們遇到了已經學過的演算法不適合解決的問題,該怎麼辦?其實很簡單,就是把控制流程和資料結構想清楚,然後用 實現就好了!在本章內我們就來看兩個例子。題目內容 這些錢及其理財收益僅僅用於你個人的日常生活消費 不買房 不買車 不置產,不用於大病 也不包括結婚生子的費用,只用來過日子。...