首页 >后端开发 >C++ >如何使用包扩展正确循环 C 参数包?

如何使用包扩展正确循环 C 参数包?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-04 05:41:39183浏览

How Can I Correctly Loop Through a C   Parameter Pack Using Pack Expansion?

使用包扩展循环参数包

在提供的代码片段中,您打算使用以下方法循环遍历可变长度参数包包扩展语法。但是,代码无法编译,并出现错误“参数包必须在此上下文中扩展。”

要解决此问题,您需要将包扩展放置在允许的上下文中。一个合适的位置是在花括号初始化列表中。考虑以下修改后的代码:

template<typename... Args>
static void foo2(Args &&... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}

其工作原理如下:

  • 虚拟数组的初始值设定项列表内的代码包含在 {} 中。
  • 包扩展语法在初始化列表中使用。具体来说, ( (void) bar(std::forward(args)), 0) 会针对包中的每个参数展开。
  • 逗号运算符用于分隔每个表达式,确保bar() 函数会为每个参数调用。
  • bar(std::forward(args)) 周围的括号用于强制转换结果作废。这可以确保使用内置的逗号运算符,而不是重载的运算符。
  • 创建的虚拟数组至少包含一个元素,以避免在参数包为空时创建非法的 0 长度数组。

通过此修改,代码将成功编译并循环参数包。

C 17 Fold表达式

在 C 17 中,您可以使用折叠表达式来简化代码:

((void) bar(std::forward<Args>(args)), ...);

此表达式展开包并应用指定的操作(在本例中,调用 bar( )) 从左到右。

以上是如何使用包扩展正确循环 C 参数包?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn