j00*_*0hi 1 c++ variadic-templates fold-expression c++17
我想在一个向量中插入尽可能多的零,因为有一个可变参数模板函数的参数(即一个向量中的参数零的数量)。我正在尝试使用折叠表达式来实现这一点,并且在使用(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;
}
Run Code Online (Sandbox Code Playgroud)
预期输出:
0
0
0
0
使用初始化列表方法输出:
0
为什么?
因为在
std::vector<int> vec = { (zeroHelper(args), ...) };
Run Code Online (Sandbox Code Playgroud)
括号只返回一个元素,最后一个;逗号运算符丢弃前面的内容。
你应该写
std::vector<int> vec = { zeroHelper(args) ... };
Run Code Online (Sandbox Code Playgroud)
维护所有元素。
在
(vec.push_back(zeroHelper(args)), ...);
Run Code Online (Sandbox Code Playgroud)
括号激活折叠,逗号丢弃除最后一个之外的所有元素,但该push_back()操作适用vec于每个args...元素。
还观察到,使用逗号操作符的丢弃礼,你不需要做zeroHelper()所有
你可以写
std::vector<int> vec { ((void)args, 0)... };
Run Code Online (Sandbox Code Playgroud)
或者
(vec.push_back(((void)args, 0)), ...);
Run Code Online (Sandbox Code Playgroud)