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, "!");
};
相关文章:
  • 没有找到相关文章