从 C++ 模板参数包编译时间数组

Compile time array from C++ template parameter pack

我如何在编译时从模板参数包创建一个 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::arrayarray[] 还是 std::initializer_list 作为 InfoArray 的类型?

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

DEMO

Would you use std::array, array[] or std::initializer_list as type for InfoArray?

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

由于多种原因,

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

使用 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...}};
};

并且强烈喜欢 std::array<> 而不是原始数组或 initializer_list