我怎样才能在编译时从模板参数包中创建一个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的类型吗?
答案 0 :(得分:7)
template <typename... Ts>
struct ToInfoArray
{
static constexpr std::array<Info, sizeof...(Ts)> value = { { Ts::info... } };
};
你会使用std :: array,array []或std :: initializer_list作为InfoArray的类型吗?
std::array<T,N>
。它是一个聚合体,其行为(具有可比较的性能)就像常规数组一样,但提供了一个额外的接口来操作其元素;本身,它是一个可复制的类型。
std::initializer_list
不是一种选择。一旦它被用作数据成员(使用类内初始化程序),它存储的元素在任何构造函数之后都会失效。执行。它不能保证是文字类型,因此不能标记为constexpr
。它的大小在常量表达式中不可用(可访问)。它不提供随机访问逻辑(不依赖于指针算法);枚举其元素的唯一方法是从begin()
迭代到end()
,这会产生指向常量项的指针。 std::initializer_list
主要用作函数参数。
答案 1 :(得分:3)
使用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
。