【问题标题】:Compile time array from C++ template parameter pack从 C++ 模板参数包编译时间数组
【发布时间】:2015-12-21 04:19:54
【问题描述】:

如何在编译时从模板参数包创建例如 std::array?

这显示了我需要的东西,但没有参数包。

template<typename T1, typename T2, typename T3>
struct ToInfoArray
{
    static constexpr std::array<Info, 3> value = { { T1::info, T2::info, T3::info } };
};

Live demo demonstrating the intended usage

额外问题: 您会使用std::array、array[] 或std::initializer_list 作为InfoArray 的类型吗?

【问题讨论】:

    标签: c++ templates c++11 stl variadic-templates


    【解决方案1】:
    template <typename... Ts>
    struct ToInfoArray
    {
        static constexpr std::array<Info, sizeof...(Ts)> value = { { Ts::info... } };
    };
    

    DEMO

    你会使用 std::array、array[] 还是 std::initializer_list 作为 InfoArray 的类型?

    std::array&lt;T,N&gt;。它是一个聚合,其行为(具有相当的性能)就像一个常规数组,但提供了一个额外的接口来操作它的元素;本身,它是一个可复制的类型。

    std::initializer_list 在这里不是一个选项,原因有很多。一旦它被用作数据成员(使用类内初始化程序),它存储的元素在任何构造函数执行后都会失效。它不保证是文字类型,因此不能标记为constexpr。它的大小在常量表达式中不可用(可访问)。它不提供随机访问逻辑(不使用指针算法);枚举其元素的唯一方法是从begin() 迭代到end(),此外还会产生指向常量项的指针。 std::initializer_list 主要用作函数参数。

    【讨论】:

    • 可能想说明你为什么要std::array?
    【解决方案2】:

    使用 C++14,您可以简单地将其设为变量模板:

    template <typename... Ts>
    constexpr std::array<Info, sizeof...(Ts)> value{{Ts::info...}};
    

    否则,您使用的正确语法是:

    template <typename... Ts>
    struct ToInfoArray
    {
        static constexpr std::array<Info, sizeof...(Ts)> value{{Ts::info...}};
    };
    

    比起原始数组或initializer_list,更喜欢std::array&lt;&gt;。

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      相关资源
      最近更新 更多