gpt4 book ai didi

c++ - 如何使用折叠表达式扩展到初始化列表?

转载 作者:行者123 更新时间:2023-12-01 21:42:56 25 4
gpt4 key购买 nike

我想在 vector 中插入与可变参数模板函数的参数一样多的零(即,参数数量 零到 vector 中)。我正在尝试使用折叠表达式来实现这一点,它在使用 (vec.push_back(zeroHelper(args)), ...); 时有效。 .

我不明白的是:为什么当我尝试通过“展开”到初始化列表中直接初始化 vector 时它不起作用,如下所示:
std::vector<int> vec = { (zeroHelper(args), ...) };

完整源代码:

template <typename T>
T zeroHelper (T a) { return T{0}; }

template<typename ...Args>
void printer(Args&&... args) {
std::vector<int> vec; // = { (zeroHelper(args), ...) };
(vec.push_back(zeroHelper(args)), ...);
for (auto i : vec) {
std::cout << i << '\n';
}
}

int main()
{
printer(1, 2, 3, 4);
return 0;
}

And here's the source on OnlineGDB.

预期输出:

0
0
0
0

使用初始化列表方法的输出:

0

为什么?

最佳答案

因为在

std::vector<int> vec = { (zeroHelper(args), ...) };

圆括号只返回一个元素,即最后一个;逗号运算符丢弃前面的内容。

你应该写

std::vector<int> vec = { zeroHelper(args) ... };

维护所有元素。

(vec.push_back(zeroHelper(args)), ...);

圆括号激活折叠,逗号丢弃除最后一个元素之外的所有元素,但 push_back() 操作应用于每个 args.. 的 vec。 . 元素。

还请注意,使用逗号运算符的丢弃特性,您根本不需要 zeroHelper()

你可以写

std::vector<int> vec { ((void)args, 0)... };

(vec.push_back(((void)args, 0)), ...);

关于c++ - 如何使用折叠表达式扩展到初始化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61098536/

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