C++参数包展开时加括号修改参数报语法错误如何解决
问题原因
你的写法不符合C参数包展开的语法规则。C参数包展开要求对单个参数的操作模式写在...之前,展开后会自动将每个参数代入模式,并用逗号分隔生成实参列表。你写的(ws ... / 3)将...放在参数包名中间,属于语法错误,编译器无法识别该结构才会报错。
正确实现方式
如果你要给每个传入的参数都执行除以3的操作,正确的展开写法如下:
template <typename ... WS> void function2_modifyArg(int x, WS ... ws) { // 单个参数的操作模式是(ws / 3),后面加...完成整个参数包的展开 function3_end(x, (ws / 3)...); } template <typename ... WS> void function3_end(int x, WS ... ws) {};
展开效果说明
- 当你调用
function2_modifyArg(x, 7)时,代码会自动展开为function3_end(x, (7 / 3)); - 当你没有传入第二个参数时,参数包
WS为空,展开后等价于function3_end(x);,完全适配你可选参数的需求。
如果参数修改逻辑更复杂,也可以直接写在模式中,比如做类型转换、调用自定义函数处理单个参数等,只要保证模式对单个参数合法,后续加...就能正确展开整个参数包。
内容的提问来源于stack exchange,提问作者GGeorge
相关产品推荐
相关产品推荐

