/************************************************************************/ /* 文件名: Loki库学习 创建人: Clark/陈泽丹 描述: 创建日期: 20111006 */ /************************************************************************/ #include <iostream> using namespace std; class NullType {}; template <class T, class U> struct Typelist { typedef T Head; typedef U Tail; }; template <class TList> struct Length; template <> struct Length<NullType> { enum { value = 0 }; }; template <class T, class U> struct Length< Typelist<T, U> > { enum { value = 1 + Length<U>::value }; }; template <class TList, unsigned int index> struct TypeAt; template <class Head, class Tail> struct TypeAt<Typelist<Head, Tail>, 0> {//符合取头类型 typedef Head Result; }; template <class Head, class Tail, unsigned int i> struct TypeAt<Typelist<Head, Tail>, i> {//不符合取尾巴的类型 typedef typename TypeAt<Tail, i - 1>::Result Result; }; template <class TList, unsigned int index,typename DefaultType = NullType> struct TypeAtNonStrict {//加入DefaultType,当所有类型都偏特化不成功时,则以普通类型的值出现 //DefaultType用于设定找不到时的返回值 typedef DefaultType Result; }; template <class Head, class Tail, typename DefaultType> struct TypeAtNonStrict<Typelist<Head, Tail>, 0, DefaultType> { //DefaultType是偏特化的语法要求,不是递归算法的因素 typedef Head Result; }; template <class Head, class Tail, unsigned int i, typename DefaultType> struct TypeAtNonStrict<Typelist<Head, Tail>, i, DefaultType> { //typename的作用是告诉编译器其后的实体是类型,DefaultType是偏特化的语法要求,不是递归算法的因素 typedef typename TypeAtNonStrict<Tail, i - 1, DefaultType>::Result Result; }; void main() { cout<<Length<Typelist<int,Typelist<bool,Typelist<char,NullType> > > >::value<<endl; cout<<sizeof(TypeAt<Typelist<int,Typelist<bool,Typelist<char,NullType> > >, 0>::Result)<<endl; cout<<sizeof(TypeAtNonStrict<Typelist<int,Typelist<bool,Typelist<char,NullType> > >, 5>::Result)<<endl; cout<<sizeof(TypeAtNonStrict<Typelist<int,char>,0>::Result)<<endl; cout<<"------"<<endl; cout<<sizeof(TypeAtNonStrict<int,0>::Result)<<endl; system("pause"); }