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, "!");
};
给定的 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, "!");
};