gpt4 book ai didi

c++ - 结构继承自身

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:18 26 4
gpt4 key购买 nike

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

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

template<>
struct Field<TypeListEnd> {
};

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

最佳答案

Field不从自身继承;相反,template<typename TYPELIST> Field继承自 Field<typename TYPELIST::Tail> .只要两个模板参数列表不同就可以了。

variadic templates 之前,类型列表是允许模板(实际上)采用可变数量的类型参数的古老方法。被添加到语言中。他们实现了一个简单的单链表结构,相当于 LISP cons cells,其中 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元函数,在 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通过公共(public)继承包含类型列表中的所有类型。当然,用这样的 struct 做任何有用的事情这是另一回事,留给读者作为练习。

关于c++ - 结构继承自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com