?
关于 C++ 泛型中的 TypeTraits ,参考 c++ 泛型编程 之 TypeTraits
?
?
#ifndef TYPE_LISTS_H_
#define TYPE_LISTS_H_
#include
#include
#include typetraits.h /* TypeLists 内部没有任何数值(value),他们的实体是空的,不含有任何状态,也未定义任何函数。 执行期间TypeLists也不带任何数值,他们存在的理由只是为了携带型别信息。TypeLists 并未打算被具 现化。因此,当我们说“a TypeListL”,实际指的是一个typelist型别,不是一个typelist 对象。 规定 typelist 必须以NullType(类)结尾,NullType可被视为一个结束符号,类似于c字符串的功能, 定义一个只有一个元素的typelist如下: typedef Typelist
OneTypeOnly. */ template
struct Typelist { typedef T Head; typedef U Tail; }; //通过定义宏 将typelist线性化 #define TYPELIST_0() NullType #define TYPELIST_1(T1) Typelist
#define TYPELIST_2(T1,T2) Typelist
#define TYPELIST_3(T1,T2,T3) Typelist
#define TYPELIST_4(T1,T2,T3,T4) Typelist
#define TYPELIST_5(T1,T2,T3,T4,T5) Typelist
//计算TypeList长度 //大多数Typelist的操作都是基于递归,递归终止条件通过模板特化实现。 template
struct Length; template<>struct Length
//Length的全特化,即,只匹配NullType。 { enum{value = 0}; }; template
struct Length
>//Length的扁特化,可匹配任何TypeList
类型,包括U同时也是Typelist的复合情况。 { enum{value = 1+Length
::value}; }; //2 索引式访问 template
struct TypeAt; template
struct TypeAt
,0> { typedef Head Result; }; template
struct TypeAt
,i> { typedef typename TypeAt
::Result Result; }; //类似TypeAt功能,不过TypeAtNonStrict对逾界访问更加宽容。 //比如TypeList的个数是3,那么你不能使用TypeAt
::Result,这样会编译错误。 //但是TypeAtNonStrict
::Result可以,如果不存在索引为3的type,那么结果是第三个引数即NullType template
struct TypeAtNonStrict { typedef DefType Result; }; template
struct TypeAtNonStrict< Typelist
, 0, DefType > { typedef T Result; }; template
struct TypeAtNonStrict< Typelist
, i, DefType > { typedef typename TypeAtNonStrict
::Result Result; }; //3 查找TypeList template
struct IndexOf;//声明 template
struct IndexOf
//如果TList为NullType,那么令value = -1; { enum{value = -1}; }; template
struct IndexOf
,T>//如果T是TList中的头端,那么令value= 0; { enum{value = 0}; }; template
//将IndexOf施于TList尾端和T,并将结果置于一个临时变量temp struct IndexOf
,T>//如果temp为-1,令value为-1,否则令value为1+temp { private: enum{temp = IndexOf
::value};//temp要先于value声明定义。 public: enum{value = temp == -1 ? -1 : temp + 1}; }; //4 附加元素到typelist template
struct Append;//声明 template<>struct Append
//如果TList是NULL而且T是NULL,那么令Result为NullType { typedef NullType Result; }; template
struct Append
//如果TList是NullType,且T是type(非typelist), { //那么Result将是只含有唯一元素的T; typedef TYPELIST_1(T) Result; }; template
struct Append
>// 如果TList是NullType,且T是一个typelist,那么Result便是T本身 { typedef Typelist
Result; }; template
//否则,如果Tlist是non-null,那么result将是个typelist,以TList::Head struct Append
,T> //为起头端,并以T附加到TList::Tail的结果为其尾端。 { typedef Typelist
::Result> Result; }; //5 Reverse template
struct Reverse; template <>struct Reverse
{ typedef NullType Result; }; template
struct Reverse< Typelist
> { typedef typename Append< typename Reverse
::Result, Head>::Result Result; }; #endif
?
测试
?
void typelists_test()
{
typedef TYPELIST_0() TL0;
typedef TYPELIST_3(char,int,double) TL3;
typedef TYPELIST_3(char,int,double) TL3_1;
//Length
std::cout<
::value<
::value<
::Result Parm1; typedef TypeAt
::Result Parm2; typedef TypeAt
::Result Parm3; typedef TypeAtNonStrict
::Result TEST_TYPE; std::cout<
::value<
::value<
::value<
TL4;//TL4不是一个TypeList typedef Append
TL5; std::cout<
::value<
::value<
::Result).name()<
?
?