Variadic templates class in c++ 的 Variadic templates

Variadic templates of Variadic templates class in c++

给定的 Variadic 模板数据结构如下(来自 Eli Bendersky's website 的代码):

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");

那么如何定义一个可以接受以下签名的模板结构呢?

Foo<tuple<int,double>, tuple<double,int,long> ...,  tuple<std::string>> foo;

我想应该是这样的:

template<tuple<class... Ts>... Tuples>
struct VariadicTuples {};

但是无法编译。是因为 Variadic 模板中的 class 不能是 Variadic 模板吗?如果是,如何实现?

从句法上讲,您根本无法这么写。 Ts 在那种情况下会怎样? Tuples 中的每种类型都会有所不同,因此它不会真正可用。

你可以做的是利用 Columbo 的 技巧:

template <bool...> struct bool_pack;

template <bool... v>
using all_true = std::is_same<bool_pack<true, v...>, bool_pack<v..., true>>;

为了简单地 static_assert 所有 Tuples 实际上都是 tuple 然后让 VariadicTuples 成为一个简单的可变参数 class 模板:

template <typename > struct is_a_tuple : std::false_type { };
template <typename... T> struct is_a_tuple<tuple<T...>> : std::true_type { };

template <typename... Tuples>
struct VariadicTuples {
    static_assert(all_true<is_a_tuple<Tuples>::value...>::value, "!");
};