gpt4 book ai didi

c++ - 使用 std::index_sequence 进行 std::array 初始化的包扩展

转载 作者:行者123 更新时间:2023-12-04 04:14:25 25 4
gpt4 key购买 nike

我需要用采用相同构造函数参数的 N 个对象初始化一个 std:array,如 std::vector<T>(size_t, {args...}) .从我在这里的搜索中,我想出了这个,它有效:

template<typename T, size_t... Ints, typename... Args>
std::array<T, sizeof...(Ints)> make_array_(std::index_sequence<Ints...>, Args&&... args) {
return { (Ints, T{args...})... };
}

template<typename T, size_t N, typename... Args>
std::array<T, N> make_array(Args&&... args) {
return make_array_<T>(std::make_index_sequence<N>(), args...);
}

struct AStruct {
AStruct(int a, float b) : a_{ a }, b_{ b } {}
private:
int a_; float b_;
}

int main() {
auto anArray = make_array<AStruct, 10>(8, 5.4f);
// etc...
}

但我不明白第三行。怎么样 (Ints, T{args...})...翻译成 T{args...}, T{args...}, T{args...}... N次?

最佳答案

外部参数包没有像你写的那样展开,它是这样展开的(内部包没有显示展开,因为你似乎没有问题):

return { (0, T{args...}), (1, T{args...}), (2, T{args}) };

其中整数的类型是 std::size_t .
(0, T{args...})是花括号括起来的初始值设定项的一个元素。它是一个使用逗号运算符的表达式。逗号运算符首先计算左侧 ( 0 ),然后计算右侧 ( T{args...} ),返回后者。

因为评价 0没有副作用,它的值被逗号运算符丢弃,这实际上等效于
return { T{args...}, T{args...}, T{args...} };

对此有一个警告。逗号运算符可以重载。如果有过载接受 std::size_t作为第一和 T作为第二个参数,那么这将以一种意想不到的方式运行,而是用重载的结果初始化返回值。这可以通过将整数转换为 void 来防止。 (永远不能作为重载运算符调用的参数出现):
return { (void(Ints), T{args...})... };

关于c++ - 使用 std::index_sequence 进行 std::array 初始化的包扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58535982/

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