1 #ifndef TYPE_LISTS_H_
  2 #define TYPE_LISTS_H_
  3 
  4 
  5 #include <iostream>
  6 #include <string>
  7 #include "typetraits.h"
  8 
  9 /*
 10 TypeLists 内部没有任何数值(value),他们的实体是空的,不含有任何状态,也未定义任何函数。
 11 执行期间TypeLists也不带任何数值,他们存在的理由只是为了携带型别信息。TypeLists 并未打算被具
 12 现化。因此,当我们说“a TypeListL”,实际指的是一个typelist型别,不是一个typelist 对象。
 13 规定 typelist 必须以NullType(类)结尾,NullType可被视为一个结束符号,类似于c字符串的\0功能,
 14 定义一个只有一个元素的typelist如下:
 15 typedef Typelist<int,NullType> OneTypeOnly.
 16 */
 17 template<class T,class U>
 18 struct Typelist
 19 {
 20     typedef T Head;
 21     typedef U Tail;
 22 };
 23 //通过定义宏 将typelist线性化
 24 #define TYPELIST_0() NullType
 25 #define TYPELIST_1(T1) Typelist<T1,TYPELIST_0()>
 26 #define TYPELIST_2(T1,T2) Typelist<T1,TYPELIST_1(T2)>
 27 #define TYPELIST_3(T1,T2,T3) Typelist<T1,TYPELIST_2(T2,T3)>
 28 #define TYPELIST_4(T1,T2,T3,T4) Typelist<T1,TYPELIST_3(T2,T3,T4)>
 29 #define TYPELIST_5(T1,T2,T3,T4,T5) Typelist<T1,TYPELIST_4(T2,T3,T4,T5)>
 30 
 31 //计算TypeList长度
 32 //大多数Typelist的操作都是基于递归,递归终止条件通过模板特化实现。
 33 template<class TList>struct Length;
 34 template<>struct Length<NullType>//Length的全特化,即,只匹配NullType。
 35 {
 36     enum{value = 0};
 37 };
 38 template<class T,class U>
 39 struct Length<Typelist<T,U> >//Length的扁特化,可匹配任何TypeList<T,U>类型,包括U同时也是Typelist的复合情况。
 40 {
 41     enum{value = 1+Length<U>::value};
 42 };
 43 //2 索引式访问
 44 template <class TList,unsigned int index> struct TypeAt;
 45 template<class Head,class Tail>
 46 struct TypeAt<Typelist<Head,Tail>,0>
 47 {
 48     typedef Head Result;
 49 };
 50 template<class Head,class Tail,unsigned int i>
 51 struct TypeAt<Typelist<Head,Tail> ,i>
 52 {
 53     typedef typename TypeAt<Tail,i-1>::Result Result;
 54 };
 55 
 56 //类似TypeAt功能,不过TypeAtNonStrict对逾界访问更加宽容。
 57 //比如TypeList的个数是3,那么你不能使用TypeAt<TL3,3>::Result,这样会编译错误。
 58 //但是TypeAtNonStrict<TL3,3,NullType>::Result可以,如果不存在索引为3的type,那么结果是第三个引数即NullType
 59 template <class TList, unsigned int i, typename DefType = NullType>
 60 struct TypeAtNonStrict
 61 {
 62     typedef DefType Result;
 63 };
 64 template <class T, class U, typename DefType>
 65 struct TypeAtNonStrict< Typelist<T, U>0, DefType >
 66 {
 67     typedef T Result;
 68 };
 69 template <class T, class U, unsigned int i, typename DefType>
 70 struct TypeAtNonStrict< Typelist<T, U>, i, DefType >
 71 {
 72     typedef typename TypeAtNonStrict<U, i - 1, DefType>::Result Result;
 73 };
 74 
 75 //3 查找TypeList
 76 template<class TList,class T> struct IndexOf;//声明
 77 template<class T>
 78 struct IndexOf<NullType,T>//如果TList为NullType,那么令value = -1;
 79 {
 80     enum{value = -1};
 81 };
 82 template<class Tail,class T>
 83 struct IndexOf<Typelist<T,Tail> ,T>//如果T是TList中的头端,那么令value= 0;
 84 {
 85     enum{value = 0};
 86 };
 87 template<class Head,class Tail,class T>//将IndexOf施于TList尾端和T,并将结果置于一个临时变量temp
 88 struct IndexOf<Typelist<Head,Tail> ,T>//如果temp为-1,令value为-1,否则令value为1+temp
 89 {
 90 private:
 91     enum{temp = IndexOf<Tail,T>::value};//temp要先于value声明定义。
 92 public:
 93     enum{value = temp == -1 ? -1 : temp + 1};
 94 };
 95 
 96 //4 附加元素到typelist
 97 template <class Tlist,class T>struct Append;//声明
 98 template<>struct Append<NullType,NullType>//如果TList是NULL而且T是NULL,那么令Result为NullType
 99 {
100     typedef NullType Result;
101 };
102 template <class T> struct Append<NullType,T> //如果TList是NullType,且T是type(非typelist),
103 {                                           //那么Result将是"只含有唯一元素的T";
104     typedef TYPELIST_1(T) Result;
105 };
106 template <class Head,class Tail>
107 struct Append<NullType,Typelist<Head,Tail> >// 如果TList是NullType,且T是一个typelist,那么Result便是T本身
108 {
109     typedef Typelist<Head,Tail> Result;
110 };
111 template<class Head,class Tail,class T>//否则,如果Tlist是non-null,那么result将是个typelist,以TList::Head
112 struct Append<Typelist<Head,Tail>,T>   //为起头端,并以T附加到TList::Tail的结果为其尾端。
113 {
114     typedef Typelist<Head,typename Append<Tail,T>::Result> Result;
115 };
116 
117 //5 Reverse
118 template <class TList> struct Reverse;
119 template <>struct Reverse<NullType>
120 {
121     typedef NullType Result;
122 };
123 template <class Head, class Tail>
124 struct Reverse< Typelist<Head, Tail> >
125 {
126     typedef typename Append<
127         typename Reverse<Tail>::Result, Head>::Result Result;
128 };
129 
130 
131 #endif
132 
 1 void typelists_test()
 2 {
 3     typedef TYPELIST_0() TL0;
 4     typedef TYPELIST_3(char,int,double) TL3;
 5     typedef TYPELIST_3(char,int,double) TL3_1;
 6     //Length
 7     std::cout<<Length<TL0>::value<<std::endl;
 8     std::cout<<Length<TL3>::value<<std::endl;
 9 
10     //TypeAt
11     typedef TypeAt<TL3,0>::Result Parm1;
12     typedef TypeAt<TL3,1>::Result Parm2;
13     typedef TypeAt<TL3,2>::Result Parm3;
14 
15     typedef TypeAtNonStrict<TL3,3,EmptyType>::Result TEST_TYPE;
16 
17     std::cout<<"Parm1 Type:"<<typeid(Parm1).name() <<" sizeof : "<< sizeof(Parm1)<<std::endl;
18     std::cout<<"Parm2 Type:"<<typeid(Parm2).name() <<" sizeof : "<< sizeof(Parm2)<<std::endl;
19     std::cout<<"Parm3 Type:"<<typeid(Parm3).name() <<" sizeof : "<< sizeof(Parm3)<<std::endl;
20     std::cout<<"TEST_TYPE Type:"<<typeid(TEST_TYPE).name() <<" sizeof : "<< sizeof(TEST_TYPE)<<std::endl;
21 
22     //IndexOf
23     std::cout<<"char indexof TL3 :"<<IndexOf<TL3,char>::value<<std::endl;
24     std::cout<<"int indexof TL3 :"<<IndexOf<TL3,int>::value<<std::endl;
25     std::cout<<"float indexof TL3 :"<<IndexOf<TL3,float>::value<<std::endl;
26 
27     //Append 
28     typedef Append<TL3,int> TL4;//TL4不是一个TypeList
29     typedef Append<TL3_1,TYPELIST_2(float,double)> TL5;
30     std::cout<<"TL4 Length  :"<<Length<TL4::Result>::value<<std::endl;
31     std::cout<<"TL5 Length  :"<<Length<TL5::Result>::value<<std::endl;
32 
33     //Reverse
34     std::cout<<"Reverse result:"<<typeid(Reverse<TL3>::Result).name()<<std::endl;
35 }

转载
http://blog.csdn.net/zhuyingqingfen/article/details/43938713

写的非常详细
posted on 2015-09-16 22:11 arrow8209 阅读(2727) 评论(2)  编辑 收藏 引用
评论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


统计