[英]How to list-initialize a const std::array member using a std::array constructor argument C++
[英]C++ Initialize Member Array with Constructor Argument
我有一个模板类,其中包含一个编译时常量长度的单个成员数组。 我希望此数组为常数,但是很难根据构造函数提供的输入对其进行初始化:
struct Input {
int value;
};
template<size_t Size>
struct Foo {
int const myVals[Size];
Foo(std::array<Input, Size> const &in)
: myVals{ in[0].value, in[1].value, /* How many times? */ } {
}
}
由于我不知道数组的大小,因此我不知道有多少个值可用来初始化myVals
。 以下代码有效,但我怀疑这是否是最佳方法:
template<size_t Size>
struct Foo {
std::array<int, Size> const myVals;
Foo(std::array<Input, Size> const &in)
: myVals{ toIntArray(in) } {
}
private:
static std::array<int, Size> toIntArray(std::array<Input, Size> const &in) {
std::array<int, Size> result;
for (size_t i{ 0 }; i < Size; ++i) {
result[i] = in[i].value;
}
return result;
}
}
有没有更简洁的方法,或者通常被接受的方法来填充常量成员数组的值?
您可以使用std::index_sequence
将数组的索引作为非类型模板参数包获取。 然后,您可以使用参数包扩展。
template<size_t Size>
struct Foo {
int const myVals[Size];
Foo(std::array<Input, Size> const &in)
: Foo(in, std::make_index_sequence<Size>()) { }
private:
template<size_t... Is>
Foo(std::array<Input, Size> const &in, std::index_sequence<Is...>)
: myVals{in[Is].value...} { }
}
将辅助模板与size_t... Is
pack和std::index_sequence<Is...>
参数一起使用是处理固定大小的可索引容器的常用模式。 index_sequence
实际上什么也没做; 它只是一个代理,因此可以推导出Is
模板参数。 例如,如果您检查Godbolt出现下完全蒸发-O1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.