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

Compile time array from C++ template parameter pack

本文关键字:参数 c++ 时间 数组 编译      更新时间:2023-10-16

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

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

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

演示预期用法的实时演示

奖金问题:您是使用std::array, array[]还是std::initializer_list作为InfoArray的类型?

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主要被设计为函数参数

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