3.2 定義Typelists
1
2 template <class T, class U>
3 struct Typelist
4 {
5 typedef T head;
6 typedef U Tail;
7 };
Typelists內(nèi)部沒(méi)有任何數(shù)值:它的實(shí)體是空的。它們存在的理由只是為了攜帶型別信息。因此,對(duì)typelist的任何處理都發(fā)生在編譯期。此后我們提到一個(gè)typelist,指的是一個(gè)型別而非一個(gè)對(duì)象。雖然typlist只有兩個(gè)參數(shù),但我們可以把任意一個(gè)替換為另一個(gè)typelist,來(lái)達(dá)到無(wú)限延伸的目的。
另外我們需要一個(gè)零個(gè)型別以及一個(gè)型別的typelist。對(duì)于零個(gè)型別,前面提到的NullType就可以,對(duì)于一個(gè)型別,我們可以這樣定義:
1 typedef Typelist<int, NullType> OneTypeOnly;
3.3 將Typelist生成線性化
像這樣一個(gè)typelist
1
2 typedef Typlist<int, Typelist<int, Typelist<int, Typelist<int, int> > > > Int4Type;
它太Lisp了,我們定義一系列的宏來(lái)完成它,這樣我們可以忘記尖括號(hào)間的空格。
1 #define TYPELIST_1(T1) Typelist<T1, NullType>
2 #define TYPELIST_2(T1, T2) Typelist<T1, TYPELIST_1(T2) >
3 #define TYPELIST_3(T1, T2, T3) Typelist<T1, TYPELIST_2(T2, T3) >
4 #define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, TYPELIST_3(T2, T3, T4) >
5 //etc
6 #define TYPELIST_50(/* */) //
這樣前面的 Int4Type 就可以這樣定義
1 typedef Int4Type TYPELIST_4(int, int, int, int) Int4Type;
這只是包裝手法的一個(gè)開(kāi)端。我們?cè)L問(wèn)Int4Type的最后一個(gè)元素還比較麻煩,需要
1 Int4Type::Tail::Tail::Tail;
我們還要進(jìn)一步來(lái)考慮它操作的問(wèn)題。