【问题标题】:Variadic templates of Variadic templates class in c++C++中的可变参数模板类的可变参数模板
【发布时间】:2015-08-26 18:48:22
【问题描述】:

给定可变参数模板数据结构如下(代码来自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 模板中的类不能是 Variadic 模板吗?如果是这样,如何使这项工作?

【问题讨论】:

  • 在您使用Foo 的示例中,您不是传递模板本身,而是传递模板本身。 template &lt;class... Ts&gt; struct Foo; 足以编译。

标签: c++ templates c++11 metaprogramming


【解决方案1】:

从句法上讲,你根本无法写出来。在那种情况下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实际上都是tuples,然后让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, "!");
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 2013-09-14
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2022-01-23
    相关资源
    最近更新 更多