c++ - 如何使用折叠表达式扩展为初始化列表?
问题描述
我想在向量中插入与可变参数模板函数的参数一样多的零(即向量中的参数数量为零)。我正在尝试使用折叠表达式来实现这一点,并且在使用(vec.push_back(zeroHelper(args)), ...);
.
我不明白的是:为什么当我尝试通过“展开”到初始化器列表中直接初始化向量时它不起作用,如下所示:
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;
}
预期输出:
0
0
0
0
使用初始化列表方法输出:
0
为什么?
解决方案
因为在
std::vector<int> vec = { (zeroHelper(args), ...) };
括号只返回一个元素,最后一个;逗号运算符丢弃前面的内容。
你应该写
std::vector<int> vec = { zeroHelper(args) ... };
维护所有元素。
在
(vec.push_back(zeroHelper(args)), ...);
括号激活折叠,逗号丢弃除最后一个之外的所有元素,但该push_back()
操作适用vec
于每个args...
元素。
zeroHelper()
还要注意,使用逗号运算符的丢弃特性,您根本不需要
你可以写
std::vector<int> vec { ((void)args, 0)... };
或者
(vec.push_back(((void)args, 0)), ...);
推荐阅读
- google-drive-api - 如何获取桌面应用程序的 Google Drive 访问权限?
- applet - 调试Java Card小程序,了解异常原因
- java - 将数据存储到本地磁盘后如何访问h2(在spring boot项目中)控制台?
- android - 将状态包装在 NavHost 中后,无法从同一个 Jetpack Compose 屏幕收集状态
- java - 如何改善 BPM 事件分派器的延迟?
- python - 使用计算机视觉实时检测网格块(Open CV、Python)
- python - Python configparser.NoSectionError:没有部分:“数据”
- tensorflow - 使用部署到 Google Cloud AI Platform 的 LaBSE
- c++14 - 为什么这段代码在字符串输入时会中断?
- android - Android Studio Arctic Fox - 更新后未构建项目