问题一,简化版的TYPEList,只支持int型
template<int n> class TYPEList { public: int Head; TYPEList<n-1> Tail; }; template<> class TYPEList<0> { public: int Tail; int Head; };
测试代码
TYPEList<0> l0; l0.Head = 1; l0.Tail = 2; TYPEList<2> l2; l2.Head = 3; l2.Tail.Head = 4; l2.Tail.Tail.Head = 5; l2.Tail.Tail.Tail = 6;
问题二:可以同过GetAt(int)获取值
template<int n> class TYPEList { public: int Head; TYPEList<n-1> Tail; int GetAt(int index ) { if( n+1 == index ) return Head; return Tail.GetAt(index); } }; template<> class TYPEList<0> { public: int GetAt(int index) { if( 1 == index ) return Tail; return Head; } int Tail; int Head; };
测试代码
TYPEList<0> l0; l0.Head = 1; l0.Tail = 2; TYPEList<2> l2; l2.Head = 3; l2.Tail.Head = 4; l2.Tail.Tail.Head = 5; l2.Tail.Tail.Tail = 6; int i1 = l2.GetAt(0); int i2 = l2.GetAt(1); int i3 = l2.GetAt(2); int i4 = l2.GetAt(3);
问题三,类型不再限于int,但最多集成3个变量。
class NullType { }; template <class T, class U> struct Typelist { T Head; U Tail; }; template <typename T1 = NullType, typename T2 = NullType, typename T3 = NullType > struct MakeTypelist { private: typedef typename MakeTypelist< T2 ,T3>::Result TailResult; public: typedef Typelist<T1, TailResult> Result; }; template<> struct MakeTypelist<> { typedef NullType Result; };
测试代码:
MakeTypelist<ULONG,CString,int>::Result User,User2; User.Head = 1; User.Tail.Head = "何志丹"; User.Tail.Tail.Head = 35; User2 = User; template <class AtomicType, template <class> class GenFunc> struct IterateTypes { template<class II> void operator()(II ii) { GenFunc<AtomicType> genfunc; *ii = genfunc(); ++ii; //Is this even needed? } };