创建一个包含variatic类型的元组

时间:2017-01-10 19:17:29

标签: c++ templates tuples metaprogramming

今天我正在尝试创建一个特定的元组(至少对我而言)和编译时。

我有一些基本的结构,比方说:

struct Foo1 { int data; };
struct Foo2 { int data; };
struct Foo3 { int data; };

另一个结构但有一些模板的东西:

template < typename T,
           size_t Size >
struct Metadata {

  using type = T;

  std::bitset<Size>  bitset;
};

所以现在我想创建这种元组:

constexpr std::tuple<Metadata<Foo1, 3>, Metadata<Foo2, 3>, Metadata<Foo3, 3>> test { {0}, {0}, {0}};

但是以自动方式,更像是:

template < typename ... Ts >
constexpr auto make_metadata() {

  return std::tuple<Metadata<Foo1, sizeof...(Ts)>, 
                    Metadata<Foo2, sizeof...(Ts)>,
                    Metadata<Foo3, sizeof...(Ts)>>{{0},{0},{0}};
}

嗯,最后一段代码远非好,所以我希望有类似的东西,但是自动的。也许使用tuple_cat和fold表达式,但我有点失落。所以如果有人知道答案:)

3 个答案:

答案 0 :(得分:3)

您可以使用...表示单个表达式中的多个内容。在这种情况下,您希望立即和非立即展开Ts

template <class... Ts>
constexpr auto make_metadata()
{
    return std::make_tuple(Metadata<Ts, sizeof...(Ts)>{0}...);
}

此外,如果您更清楚地以这种方式撰写,那么您就不会 将所有内容写在一行上:

template <class... Ts>
constexpr auto make_metadata()
{
    constexpr size_t N = sizeof...(Ts);
    return std::make_tuple(Metadata<Ts, N>{0}...);
}

答案 1 :(得分:2)

使用Sheet2进行简单的可变参数模板扩展就足够了:

std::make_tuple

答案 2 :(得分:1)

以下应该做你想做的事:

template <typename T> struct tag {};

template <typename ... Ts>
constexpr auto make_metadata() {

  return std::tuple<Metadata<Ts, sizeof...(Ts)>...>{{(tag<Ts>{}, 0)}...};
}