c++中可变模板类的可变模板
Variadic templates of Variadic templates class in c++
本文关键字:c++ 更新时间:2023-10-16
给出可变模板的数据结构如下(代码来自Eli Bendersky的网站):
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 {};
,但无法编译。是因为可变模板中的类不能是可变模板吗?如果是这样,如何使其发挥作用?
从语法上讲,您根本不能这样写。在这种情况下,Ts
会是什么?对于Tuples
中的每种类型,它都是不同的所以它实际上是不可用的。
你可以做的是利用Columbo的bool_pack
技巧:
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
s,然后有VariadicTuples
是一个简单的可变类模板:
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, "!");
};
相关文章:
- 没有找到相关文章