结构继承自身

whi*_*one 5 c++ templates

我从朋友处得到了一段代码.但我真的很困惑,结构如何从自身继承?继承是否有意义?

template<class TYPELIST>
struct Field : public Field<typename TYPELIST::Tail> {
  typedef TYPELIST TypeListType;
  typename TypeListType::Head item_;
};

template<>
struct Field<TypeListEnd> {
};
Run Code Online (Sandbox Code Playgroud)

我不知道这里发生了什么.

eca*_*mur 9

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;
Run Code Online (Sandbox Code Playgroud)

这里我假设这TypeList是一个模板定义HeadTailtypedef成员分别对应于它的第一个和第二个模板参数:

template<typename Head, Tail> struct TypeList { typedef Head Head; typedef Tail Tail; };
Run Code Online (Sandbox Code Playgroud)

请注意,我必须对结束尖括号进行空格分隔,因为这可能必须在C++ 03编译器上进行编译,其中>>总是甚至在模板上下文中将其解释为右移运算符.

然后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;
};
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个struct包含公共继承的类型列表中的所有类型.当然,做一些有用的事情struct是另一回事,留给读者练习.