网站开发g,制作个人网站的要求,wordpress页面怎么加入php网页,企业网站建设中图片优化的方法文章最后给出了汇总的代码#xff0c;可直接运行
1. typelist是什么
typelist是一种用来操作类型的容器。和我们所熟知的vector、list、deque类似#xff0c;只不过typelist存储的不是变量#xff0c;而是类型。
typelist简单来说就是一个类型容器#xff0c;能够提供一… 文章最后给出了汇总的代码可直接运行
1. typelist是什么
typelist是一种用来操作类型的容器。和我们所熟知的vector、list、deque类似只不过typelist存储的不是变量而是类型。
typelist简单来说就是一个类型容器能够提供一系列的操作。
本文将展示使用元编程实现typelist。
2. 要实现的typelist的接口
在此列举一下即将要编写的typelist的所有接口 typelist要实现的容器类型。fronttypelist获取容器中的第一个元素。sizetypelist获取容器的元素数量。pop_fronttypelist, elem移出第一个元素。push_fronttypelist, elem向开头插入一个元素。push_backtypelist, elem向结尾插入一个元素。replace_fronttypelist, elem替换第一个元素。is_emptytypelist判断是否为空。findtypelist, index查找下标为index的元素。get_maxsize_typetypelist容器中尺寸sizeof最大的元素。reversetypelist翻转容器中的元素。 3. 接口实现
3.1 容器
templatetypename... Elems
struct typelist{};
3.2 fronttypelist
templatetypename TPLT// typelist的简写
struct front;struct fronttypelistFirstElem, OtherElems...
{using type FirstElem;
};
3.3 sizetypelist
templatetypename TPLT
struct size;templatetypename... Elems
struct sizetypelistElems...
{static inline const value sizeof...(Elems);
};
3.4 pop_fronttypelist, elem
templatetypename TPLT
struct pop_front;templatetypename FirstElem, typename... OtherElems
struct pop_fronttypelistFirstElem, OtherElems...
{using type typelistOtherrElems...;
};
3.5 push_fronttypelist, elem
templatetypename TPLT, typename newElem
struct push_front;templatetypename... Elems, typename newElem
struct push_fronttypelistElems..., newElem
{using type typelistnewElem, Elems...;
};
3.6 push_backtypelist, elem
templatetypename TPLT, typename newElem
struct push_back;templatetypename... Elems, typename newElem
struct push_backtypelistElems..., newElem
{using type typelistElems..., newElem;
};
3.7 replace_frontTPLT, elem
templatetypename TPLT, typename Elem
struct replace_front;templatetypename FirstElem, typename... OtherElems, typename Elem
struct replace_fronttypelistFirstElem, OtherElems..., Elem
{using type typelistElem, OtherElems...;
};
3.8 is_emptyTPLT
templatetypename TPLT
struct is_empty;templatetypename... Elems
struct is_empty
{static inline const bool value sizeof...(Elems) 0;
};
3.9 findtypelist, index
templatetypename TPLT, size_t index
struct find : findtypename pop_frontTPLT::type, index - 1
{};templatetypename TPLT
struct findTPLT, 0 :frontTPLT
{
};
3.10 get_maxsize_typetypelist
templatetypename TPLT
struct get_maxsize_type
{
private:using FirstType typename frontTPLT::type;using RemainLT typename pop_frontTPLT::type;using RemainMaxType typename get_maxsize_typeRemainLT::type;
public:using type conditional_t (sizeof(FirstType) sizeof(RemainMaxType)),FirstType, RemainMaxType ;
};templatetypename Elem
struct get_maxsize_typetypelistElem
{using type Elem;
};template
struct get_maxsize_typetypelist;
3.11 reversetypelist
templatetypename TPLT
struct reverse
{
private:using FirstElem typename frontTPLT::type;using RemainTL typename pop_frontTPLT::type;using ReversedRemainTL typename reverseRemainTL::type;
public:using type typename push_backReversedRemainTL, FirstElem::type;
};template
struct reversetypelist
{using type typelist;
};
或
templatetypename TPLT, bool is_emptyTPLT::value
struct reverse;templatetypename TPLT
struct reverseTPLT, false
{
private:using FirstElem typename frontTPLT::type;using RemainTL typename pop_frontTPLT::type;using ReversedRemainTL typename reverseRemainTL::type;
public:using type typename push_backReversedRemainTL, FirstElem::type;
};templatetypename TPLT
struct reverseTPLT, true
{using type typelist;
};
4. 完整代码 #include iostream
#include string
#include boost/type_index.hppusing namespace std;templatetypename T
class TypeGetter
{
public:static inline const std::string name boost::typeindex::type_id_with_cvrT().pretty_name();
};namespace myTypeList
{templatetypename... Tstruct typelist {};templatetypename TPLTstruct front;templatetypename FirstType, typename... Othersstruct front typelistFirstType, Others...{using type FirstType;};templatetypename TPLTstruct size;templatetypename... Argsstruct sizetypelistArgs...{static const inline size_t value sizeof...(Args);};templatetypename TPLTstruct is_empty;templatetypename... Elemsstruct is_emptytypelistElems...{static constexpr bool value sizeof...(Elems) 0;};templatetypename TPLTstruct pop_front;templatetypename FirstType, typename... Othersstruct pop_front typelistFirstType, Others... {using type typelistOthers...;};templatetypename TPLT, typename Tstruct push_front;templatetypename... Types, typename Tstruct push_fronttypelistTypes..., T{using type typelistT, Types...;};templatetypename TPLT, typename Tstruct push_back;templatetypename... Types, typename Tstruct push_backtypelistTypes..., T{using type typelistTypes..., T;};templatetypename TPLT, typename newElemstruct replace_front;templatetypename FirstElem, typename... OtherElems, typename newElemstruct replace_fronttypelistFirstElem, OtherElems..., newElem{using type typelistnewElem, OtherElems...;};templatetypename TPLT, size_t indexstruct find : findtypename pop_frontTPLT::type, index - 1{};/*和下面的写法是等价的templatetypename TPLT, size_t indexstruct find{using type typename findtypename pop_frontTPLT::type, index - 1::type;};*/templatetypename TPLTstruct findTPLT, 0 :frontTPLT{};/*get_maxsize_type: 获取typelist中尺寸最大的类型*/templatetypename TPLTstruct get_maxsize_type{private:using FirstType typename frontTPLT::type;using RemainLT typename pop_frontTPLT::type;using RemainMaxType typename get_maxsize_typeRemainLT::type;public:using type conditional_t (sizeof(FirstType) sizeof(RemainMaxType)),FirstType, RemainMaxType ;};templatetypename Elemstruct get_maxsize_typetypelistElem{using type Elem;};templatestruct get_maxsize_typetypelist;/*reverse: 翻转typelist*//*// 版本一templatetypename TPLTstruct reverse{private:using FirstElem typename frontTPLT::type;using RemainTL typename pop_frontTPLT::type;using ReversedRemainTL typename reverseRemainTL::type;public:using type typename push_backReversedRemainTL, FirstElem::type;};templatestruct reversetypelist{using type typelist;};*/templatetypename TPLT, bool is_emptyTPLT::valuestruct reverse;templatetypename TPLTstruct reverseTPLT, false{private:using FirstElem typename frontTPLT::type;using RemainTL typename pop_frontTPLT::type;using ReversedRemainTL typename reverseRemainTL::type;public:using type typename push_backReversedRemainTL, FirstElem::type;};templatetypename TPLTstruct reverseTPLT, true{using type typelist;};
}class A {};int main()
{using TPL_1 myTypeList::typelistchar, short, int, A, double;using TPL_2 myTypeList::typelist;cout TPL_1 的第一个类型为 TypeGetter myTypeList::frontTPL_1::type ::name endl;//cout TPL_2 的第一个类型为 TypeGetter myTypeList::frontTPL_2::type ::name endl;cout TPL_1 的size为 myTypeList::sizeTPL_1::value endl;cout TPL_2 的size为 myTypeList::sizeTPL_2::value endl;cout TPL_1 的pop_front为 TypeGetter myTypeList::pop_front TPL_1 ::type ::name endl;//cout TPL_2 的pop_front为 TypeGetter myTypeList::pop_front TPL_2 ::type ::name endl;cout TPL_1 push_front bool 为 TypeGetter myTypeList::push_frontTPL_1, bool::type::name endl;cout TPL_2 push_front bool 为 TypeGetter myTypeList::push_frontTPL_2, bool::type::name endl;cout TPL_1 push_back bool 为 TypeGetter myTypeList::push_backTPL_1, bool::type::name endl;cout TPL_2 push_back bool 为 TypeGetter myTypeList::push_backTPL_2, bool::type::name endl;cout TPL_1 replace_front with char 为 TypeGetter myTypeList::replace_front TPL_1, char ::type::name endl;cout TPL_1 index 2 type 为 TypeGetter myTypeList::findTPL_1, 2::type ::name endl;cout TPL_1 max size type 为 TypeGettermyTypeList::get_maxsize_typeTPL_1::type::name endl;cout TPL_1 为 TypeGetterTPL_1::name endl;cout TPL_1 reverse 为 TypeGettermyTypeList::reverseTPL_1::type::name endl;return 0;
}运行结果如下