从 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::array
、array[]
还是 std::initializer_list
作为 InfoArray 的类型?
template <typename... Ts>
struct ToInfoArray
{
static constexpr std::array<Info, sizeof...(Ts)> value = { { Ts::info... } };
};
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
。
我如何在编译时从模板参数包创建一个 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 的类型?
template <typename... Ts>
struct ToInfoArray
{
static constexpr std::array<Info, sizeof...(Ts)> value = { { Ts::info... } };
};
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
。