如果你使用过Boost::tuple,而且阅读过其源码,那么,Typelist在你的面前或许没有任何的神秘感,你可以很轻易的读懂Typelist的源码,但是,Tuple和Typelist的设计目标是完全不一样的.
TypeList的基础代码
template <class T, class U>
struct Typelist
{
typedef T Head;
typedef U Tail;
};
这个代码看起来没有任何可发挥指出,但是alex将这些代码和模板组合起来,就发挥了不可思议的变化.TypeList的产生模板如下:
template
<
typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
typename T4 = NullType, typename T5 = NullType, typename T6 = NullType,
typename T7 = NullType, typename T8 = NullType, typename T9 = NullType,
typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
typename T16 = NullType, typename T17 = NullType, typename T18 = NullType
>
struct MakeTypelist
{
private:
typedef typename MakeTypelist
<
T2 , T3 , T4 ,
T5 , T6 , T7 ,
T8 , T9 , T10,
T11, T12, T13,
T14, T15, T16,
T17, T18
>
::Result TailResult;
public:
typedef Typelist<T1, TailResult> Result;
};
template<>
struct MakeTypelist<>
{
typedef NullType Result;
};
这个就是Typelist的产生代码,而且是在编译过程中产生的。 主要的技术是使用模板偏特化和模板递归。
所以,我们很容易推导出:
MakeTypelist<a,b,c>::Result = Typelist<a, Typelist<b, Typelist<c, NullType> > >;
同时,alex还提供了对Typelist的操作模板,也是使用模板偏特化和模板递归实现的,如:
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 TList, class T> struct IndexOf;
template <class TList, class T> struct Append;
template <class TList, class T> struct Erase;
template <class TList, class T> struct EraseAll;
template <class TList> struct NoDuplicates;
template <class TList, class T, class U> struct Replace;
template <class TList, class T, class U> struct ReplaceAll;
template <class TList> struct Reverse;
template <class TList, class T> struct MostDerived;
template <class TList> struct DerivedToFront;