MPL(Meta-Programming Library)是由David Abrahams和Aleksey Gurtovoy為方便模板元編程而開發的庫,2003年被Boost吸納為其中的一員,此後又歷經一些大幅度修改,已經相當完善,其最新版本於2004年11月發布。MPL的出現是C++模板元編程發展中的一大創舉,它提供了一個通用、高層次的編程框架,其中包括了序列(Sequence)、疊代器(Iterator)、算法(Algorithm)、元函式(Metafunction)等多種組件,具有高度的可重用性,不但提高了模板元編程的效率,而且使模板元編程的套用範圍得到相當的擴展。
基本介紹
- 中文名:元編程庫
- 外文名:Meta-Programming Library
- 開發者:David AbrahamsAleksey Gurtovoy
- 用途:開發程式
MPL的組織架構
STL概念 | MPL對應概念 |
---|---|
容器(Container) | 序列(Sequence) |
算法(Algorithm) | 算法(Algorithm) |
疊代器(Iterator) | 疊代器(Iterator) |
仿函式(Functor) | 元函式類(Metafunction) |
配接器(Adaptor) | 有View、Inserter Iterator和相當於仿函式配接器的Binding元函式 |
配置器(Allocator) | 無此概念 |
標準中沒有定義 | 宏(Macro) |
MPL對其他庫的依賴
//Preprocessor的宏,得到目前屬於第幾次疊代#definei_BOOST_PP_FRAME_ITERATION(1)...template<//Preprocessor的宏,枚舉參數列表BOOST_PP_ENUM_PARAMS(i_,typenameT)>//Preprocessor的宏,拼合vector和當前次數structBOOST_PP_CAT(vector,i_){...}
//Preprocessor的宏,其中第一個參數3表示後面的參數組有3個//元素,0和10表示疊代的範圍是從0到10,最後一個參數是檔案//疊代的檔案名稱#defineBOOST_PP_ITERATION_PARAMS_1/(3,(0,10,))//Preprocessor的宏,要求按照上面的指定的參數進行遞歸#includeBOOST_PP_ITERATE()
MPL中的序列
概述
性質 | 含義/主要模型 |
---|---|
前向序列Forward Sequence | begin和end元函式能夠界定其頭尾範圍的類型序列/ MPL中所有序列 |
雙向序列Bidirectional Sequence | 疊代器屬於雙向疊代器的前向序列/ vector,range_c |
隨機訪問序列Random Access Sequence | 疊代器屬於隨機訪問疊代器的雙向序列/ vector,range_c |
可擴展序列Extensible Sequence | 允許插入和刪除元素的序列/ vector,list |
前可擴展序列Front Extensible Sequence | 允許在前端插入和刪除元素的可擴展序列/ vector,list |
後可擴展序列Back Extensible Sequence | 允許在後端插入和刪除元素的可擴展序列/ vector,list |
關聯序列Associative Sequence | 可以用key值來檢索元素的前向序列/ set,map |
可擴展關聯序列Extensible Associative Sequence | 允許插入和刪除元素的關聯序列/ set,map |
整型序列包裝器Integral Sequence Wrapper | 存放一系列整型常量類(Integral Constant)的一種類模板/ vector_c,list_c,set_c |
不定序列Variadic Sequence | 可以用給定元素個數或用不指定元素個數的形式來定義的序列/ vector,list,map |
vector和deque
begin::type | 返回一個疊代器指向v的頭部 |
end::type | 返回一個疊代器指向v的尾部 |
size::type | 返回一個v的大小 |
empty::type | 若且唯若v為空時返回一個整型常量類,其值為true |
front::type | 返回v的第一個元素 |
back::type | 返回v的最後一個元素 |
at::type | 返回v的第n個元素 |
insert::type | 返回一個新的vector使其定義為[begin::type, pos), x, [pos, end::type) |
insert_range::type | 返回一個新的vector使其定義為[begin::type, pos), [begin::type, end::type) [pos, end::type) |
erase::type | 返回一個新的vector使其定義為[begin::type, pos), [next::type, end::type) |
erase::type | 返回一個新的vector使其定義為[begin::type, pos), [last, end::type) |
clear::type | 返回一個空的vector |
push_back::type | 返回一個新的vector使其定義為[begin::type, end::type), x |
pop_back::type | 返回一個新的vector使其定義為[begin::type, prior< end::type >::type) |
push_front::type | 返回一個新的vector使其定義為[begin::type, end::type), x |
pop_front::type | 返回一個新的vector使其定義為[next< begin::type >::type, end::type) |
template<typenameDummy=na>structvector0;template<>structvector0{#ifdefined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)typedefaux::vector_tagtag;typedefvector0type;typedeflong_<32768>lower_bound_;typedeflower_bound_upper_bound_;typedeflong_<0>size;staticaux::type_wrapperitem_(...);#elsetypedefaux::vector_tag<0>tag;typedefvector0type;typedefvoid_item0;typedefv_iter,0>begin;typedefv_iter,0>end;#endif};
#ifdefined(BOOST_MPL_CFG_TYPEOF_BASED_SEQUENCES)structvector_tag;#elsetemplate<longN>structvector_tag;#endif
list
template<typenameSize,typenameT,typenameNext>structl_item{typedefaux::list_tagtag;typedefl_itemtype;typedefSizesize;typedefTitem;typedefNextnext;};
structl_end{typedefaux::list_tagtag;typedefl_endtype;typedeflong_<0>size;};
list作為不定序列,其實現方式與vector如出一轍,也是通過繼承listn,比如對於一個參數的list:
template<typenameT0>structlist<T0,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na>:list1<T0>{typedeftypenamelist1<T0>::typetype;};
set
has_key<s,k>::type | 如果s中包含一個類型key值為k,則返回一個整型常量類,其值為true。 |
count<s,k>::type | 返回s中key值為k的元素的序號。 |
order<s,k>::type | 返回s中key值為k的元素唯一的整型常量類,其值是一個無符號整數。 |
at<s,k>::type at<s,k,def>::type | 返回s中含有key值為k的元素。 |
key_type<s,x>::type | 返回類型等同於x。 |
value_type<s,x>::type | 返回類型等同於x。 |
erase_key<s,k>::type | 返回一個新的set,當中不包括key值k。 |