首页 > 后端开发 > C++ > 如何正确循环可变参数模板中的参数包?

如何正确循环可变参数模板中的参数包?

Patricia Arquette
发布: 2024-12-27 16:42:10
原创
580 人浏览过

How to Correctly Loop Over a Parameter Pack in Variadic Templates?

如何使用 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板