Field
不從自身繼承;相反,template<typename TYPELIST> Field
繼承自Field<typename TYPELIST::Tail>
。只要這兩個模板參數列表是不同的就可以了。
類型列表是一種陳舊的方法,允許模板(實際上)在將variadic templates添加到該語言之前獲取可變數量的類型參數。他們實現了一個簡單的單鏈表結構,相當於LISP cons單元,其中Head
是「有效載荷」類型,其他列表是,它可以是類型列表或TypeListEnd
類型,相當於LISP nil
。
假設我們有
typename TypeList<int, TypeList<char, TypeList<float, TypeListEnd> > > MyTypeList;
在這裏,我假設TypeList
是分別對應於它的第一個和第二個模板參數定義Head
和Tail
的typedef成員模板:
template<typename Head, Tail> struct TypeList { typedef Head Head; typedef Tail Tail; };
注意,我因爲這可能必須在C++ 03編譯器上編譯,所以在模板上下文中,>>
總是偶數解釋爲鑽井平臺ht移位運算符。
然後你Field
元函數,對MyTypeList
調用時,將業務拓展到
Field<MyTypeList>;
Field<typename TypeList<int, TypeList<char, TypeList<float, TypeListEnd> > > >;
struct Field<...>: TypeList<int, TypeList<char, TypeList<float, TypeListEnd> > >::Tail {
TypeList<int, TypeList<char, TypeList<float, TypeListEnd> > >::Head item;
};
struct Field<...>: TypeList<char, TypeList<float, TypeListEnd> > {
int item;
};
...
struct Field<...>: struct Field<...>: struct Field<...>: struct Field<TypeListEnd> {
} {
float item;
} {
char item;
} {
int item;
};
這爲您提供公共繼承包含所有類型的類型串的一個struct
。當然,對這樣的struct
做任何有用的事情都是另一回事,只是作爲讀者的練習。
讓我們清楚,一個結構不能繼承自身,因爲它會遞歸_ad infinitum_。但這不是你的代碼中發生的事情。 –
@jweyrich這不是CRTP;那會是'struct Field:SomeTemplate'。這只是C++ 03類型列表模板元編程。 –
ecatmur
@ecatmur:true!剛剛刪除了我的錯誤評論。 – jweyrich