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

时间:2015-09-23 18:04:32

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

我怎样才能在编译时从模板参数包中创建一个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的类型吗?

2 个答案:

答案 0 :(得分:7)

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<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