【问题标题】:Create a tuple with variatic type wrapped创建一个包含可变类型的元组
【发布时间】:2017-01-10 19:17:28
【问题描述】:

今天我正在尝试在编译时创建一个稍微具体的元组(至少对我而言)。

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

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 表达式,但我有点迷茫。所以如果有人知道答案:)

【问题讨论】:

    标签: c++ templates tuples metaprogramming


    【解决方案1】:

    您可以使用... 在一个表达式中表示多个事物。在这种情况下,您希望立即和非立即扩展 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}...);
    }
    

    【讨论】:

    • 似乎使用 C++17 我不必明确地放置 std::make_tuple 。不过还是要感谢你和纪尧姆 :)
    • @MathieuVanNevel 当然,你可以保存 5 个字符,然后写 std::tuple(...)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      以下应该做你想要的:

      template <typename T> struct tag {};
      
      template <typename ... Ts>
      constexpr auto make_metadata() {
      
        return std::tuple<Metadata<Ts, sizeof...(Ts)>...>{{(tag<Ts>{}, 0)}...};
      }
      

      【讨论】:

        猜你喜欢
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多