如何使用 Pack 扩展循环参数包
使用可变参数模板和函数时,了解 pack 的使用至关重要扩展。考虑以下代码:
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); }
编译后,此代码失败并出现错误:
Error C3520: 'args': parameter pack must be expanded in this context
解决方案:在 Braced-Init-List 中打包扩展
要解决此问题,您可以在braced-init-list:
template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
理解 Braced-Init-List
数组定义中的初始化器列表将包扩展扩展为逗号分隔的列表。强制转换为 void 可确保使用的逗号运算符是内置运算符,而不是任何重载版本。这保证了包扩展的从左到右评估。
C 17 的其他选项
在 C 17 中,您可以使用折叠来简化代码表达式:
((void) bar(std::forward<Args>(args)), ...);
结论
通过在 C 17 中的花括号初始化列表或折叠表达式中使用包扩展,您可以有效地循环参数包并避免编译错误。理解这项技术对于在 C 中使用可变参数模板和函数至关重要。
以上是如何正确循环可变参数模板中的参数包?的详细内容。更多信息请关注PHP中文网其他相关文章!