元组如何<ts ...>&amp; base = t;在元组实现中工作

时间:2017-12-02 16:38:36

标签: c++ c++11 templates variadic-templates

当我阅读帖子Variadic templates in C++时,我无法在元组的实现中获得一行。

template <size_t k, class... Ts>
typename std::enable_if<
    k == 0, typename elem_type_holder<0, tuple<Ts...>>::type&>::type
get(tuple<Ts...>& t) {
  return t.tail;
}

template <size_t k, class T, class... Ts>
typename std::enable_if<
    k != 0, typename elem_type_holder<k, tuple<T, Ts...>>::type&>::type
get(tuple<T, Ts...>& t) {
  tuple<Ts...>& base = t;
  return get<k - 1>(base);
}

tuple<Ts...>& base = t;是什么意思?我认为t的类型是tuple<T, Ts...>&,无法转换为tuple<Ts...>&

1 个答案:

答案 0 :(得分:2)

它是从派生类引用到基类引用的转换,它是一个完全有效的 C ++ 代码。

正如您在实施中所看到的,tuple<T, Ts...>源自tuple<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;
};

由于t的类型为tuple<T, Ts...>&,您可以将其投放到tuple<Ts...>&和&#34;扔掉&#34;元组中的一个元素。