gpt4 book ai didi

C++ 使用构造函数参数初始化成员数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:55 25 4
gpt4 key购买 nike

我有一个模板类,其中包含一个编译时常量长度的成员数组。我希望这个数组是常量,但事实证明根据构造函数提供的输入来初始化它很困难:

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 的辅助模板打包和一个std::index_sequence<Is...> argument 是处理固定大小的可索引容器的常见模式。 index_sequence实际上什么都不做;它只是一个代理,因此 Is可以推导出模板参数。例如。如果你check on Godbolt它似乎在-O1下完全蒸发了.

关于C++ 使用构造函数参数初始化成员数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55908503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com