下面的网页有一个可变数据结构(元组(链接的示例。我对下面的代码有一个问题,据称它生成了下面的类层次结构。我的问题是,层次结构是如何生成的?我不知道新的struct type<Ts...>
是在哪里生成的?感谢
template <class... Ts> struct tuple {};
template <class T, class... Ts>
struct tuple<T, Ts...> : tuple<Ts...> {
tuple(T t, Ts... ts) : tuple<Ts...>(ts...), tail(t) {}
T tail;
};
类层次结构:
tuple<double, uint64_t, const char*> t1(12.2, 42, "big");
struct tuple<double, uint64_t, const char*> : tuple<uint64_t, const char*> {
double tail;
}
struct tuple<uint64_t, const char*> : tuple<const char*> {
uint64_t tail;
}
struct tuple<const char*> : tuple {
const char* tail;
}
struct tuple {
}
这里有两个类模板
template <class... Ts> struct tuple {}; #1
和
template <class T, class... Ts>
struct tuple<T, Ts...> : tuple<Ts...> { ... } #2
在这种情况下,#2被认为更专业,所以当你有时
tuple<double, uint64_t, const char*>
#2被淘汰给你
struct tuple<double, uint64_t, const char*> : tuple<uint64_t, const char*>
这种情况一直在发生,创建你所拥有的链,直到你到达
struct tuple<const char*> : tuple {
const char* tail;
}
这里CCD_ 2没有参数,所以它可以调用的唯一模板是#1,然后生成的结束情况
struct tuple {};
当无法从类型列表中提取单个类型时(这意味着该列表为空(,以下代码将生效:
template <class... Ts> struct tuple {};
这是一个空结构,它成为其余类的基。
如果至少有一种类型,编译器将列表分为class T
和其他类型(列表中少一种类型(:
template <class T, class... Ts>
struct tuple<T, Ts...> : tuple<Ts...> {
tuple(T t, Ts... ts) : tuple<Ts...>(ts...), tail(t) {}
T tail;
};