Field
不从自身继承;相反,template<typename TYPELIST> Field
继承自Field<typename TYPELIST::Tail>
. 只要两个模板参数列表是不同的就可以了。
在可变参数模板被添加到语言之前,类型列表是一种允许模板(实际上)采用可变数量的类型参数的古老方法。他们实现了一个简单的单链表结构,相当于 LISP 的 cons 单元,其中Head
“有效负载”类型和Tail
列表的其余部分是类型列表或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 编译器上编译,>>
即使在模板上下文中也总是被解释为右移运算符。
然后你的Field
元函数,当调用 on 时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
通过公共继承包含类型列表中的所有类型。当然,用这样的 a 做任何有用的事情struct
是另一回事,留给读者作为练习。