可变数据结构模板实例化



下面的网页有一个可变数据结构(元组(链接的示例。我对下面的代码有一个问题,据称它生成了下面的类层次结构。我的问题是,层次结构是如何生成的?我不知道新的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;
};

最新更新