C++0x - Templates Aliasesで型リスト

まずベースとなるもの

struct nil {};

template <class Car, class Cdr>
struct cons {
    typedef Car car;
    typedef Cdr cdr;
};


いまの型リストはこれ

#define TYPELIST1(T0)                                     cons<T0, nil>
#define TYPELIST2(T0, T1)                                 cons<T0, TYPELIST1(T1) >
#define TYPELIST3(T0, T1, T2)                             cons<T0, TYPELIST2(T1, T2) >
#define TYPELIST4(T0, T1, T2, T3)                         cons<T0, TYPELIST3(T1, T2, T3) >
#define TYPELIST5(T0, T1, T2, T3, T4)                     cons<T0, TYPELIST4(T1, T2, T3, T4) >
#define TYPELIST6(T0, T1, T2, T3, T4, T5)                 cons<T0, TYPELIST5(T1, T2, T3, T4, T5) >
#define TYPELIST7(T0, T1, T2, T3, T4, T5, T6)             cons<T0, TYPELIST6(T1, T2, T3, T4, T5, T6) >
#define TYPELIST8(T0, T1, T2, T3, T4, T5, T6, T7)         cons<T0, TYPELIST7(T1, T2, T3, T4, T5, T6, T7) >
#define TYPELIST9(T0, T1, T2, T3, T4, T5, T6, T7, T8)     cons<T0, TYPELIST8(T1, T2, T3, T4, T5, T6, T7, T8) >
#define TYPELIST10(T0,T1, T2, T3, T4, T5, T6, T7, T8, T9) cons<T0, TYPELIST9(T1, T2, T3, T4, T5, T6, T7, T8, T9) >


C++0xではたぶんこんな感じ

template <class T0>
using type_list1 = cons<T0, nil>;

template <class T0, class T1>
using type_list2 = cons<T0, type_list1<T1>>;

template <class T0, class T1, class T2>
using type_list3 = cons<T0, type_list2<T1, T2>>;

template <class T0, class T1, class T2, class T3>
using type_list4 = cons<T0, type_list3<T1, T2, T3>>;

template <class T0, class T1, class T2, class T3, class T4>
using type_list5 = cons<T0, type_list4<T1, T2, T3, T4>>;

template <class T0, class T1, class T2, class T3, class T4, class T5>
using type_list6 = cons<T0, type_list5<T1, T2, T3, T4, T5>>;

template <class T0, class T1, class T2, class T3, class T4, class T5, class T6>
using type_list7 = cons<T0, type_list6<T1, T2, T3, T4, T5, T6>>;

template <class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7>
using type_list8 = cons<T0, type_list7<T1, T2, T3, T4, T5, T6, T7>>;

template <class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
using type_list9 = cons<T0, type_list8<T1, T2, T3, T4, T5, T6, T7, T8>>;

template <class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
using type_list10 = cons<T0, type_list9<T1, T2, T3, T4, T5, T6, T7, T8, T9>>;

・・・たぶんね。