2012-06-25 59 views
4

我从我的朋友那里得到了一段代码。但我真的很困惑,一个结构怎么能从它自身继承?继承是否有意义?一个结构继承自己

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

template<> 
struct Field<TypeListEnd> { 
}; 

我不知道这里发生了什么事。

+2

让我们清楚,一个结构不能继承自身,因为它会递归_ad infinitum_。但这不是你的代码中发生的事情。 –

+3

@jweyrich这不是CRTP;那会是'struct Field:SomeTemplate '。这只是C++ 03类型列表模板元编程。 – ecatmur

+0

@ecatmur:true!刚刚删除了我的错误评论。 – jweyrich

回答

8

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是分别对应于它的第一个和第二个模板参数定义HeadTail的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做任何有用的事情都是另一回事,只是作为读者的练习。

2

当你有一个类模板template <typename X> class SomeTemplate,然后类类型SomeTemplate<A>SomeTemplate<B>是两个完全不同的,不相关的类类型(假设AB是不同的)。由于它们是两种完全不同的类型,因此它们之中的一个从另一个继承。 SomeTemplate<A>可以从SomeTemplate<B>继承,它继而可以继承自SomeTemplate<C>等等,只要它在某个时刻不会变成自引用。

换句话说,在您的示例中,struct不像您认为的那样继承自身。在你的例子中根本没有struct。相反,你的例子有几个模板对于struct s。这些模板当且仅当它们是专用的时,即当所有模板参数被实际类型替换时都变为struct。由于继承,该专业化可能会变成合法或非法取决于额外的细节(你没有提供)。