如何调用使用数组将函数应用于可变参数包的成语

How to call the idiom of using an array to apply a function to a variadic pack

本文关键字:应用于 函数 变参 参数 成语 数组 何调用 调用      更新时间:2023-10-16

这是有问题的成语:

template<typename... T>
void f(T... t) {
    int temp[] = {(g(t), 0)...};
}

这将编译为g(t0); g(t1); ...,函数调用的顺序由 C++11[dcl.init.list]/4 保证。
更好的版本使用 std::initializer_list 而不是数组,但在这里并不重要。

问题是:我们应该如何称呼这个成语?

更新:
基本上,我们应该建议人们使用它而不是递归,即替换两个重载
的成语
void f() {}
void f(H head, T... tail) { g(head); f(tail...); }与单
void f(T... t) { int temp[]{(g(t), 0)...}; }

当然,我们可以称它为"一个将被折叠表达式取代的成语",但我希望有一个适当的术语。

包扩展。

C++11 §5.1.2/23 in [expr.prim.lambda]:

"> 捕获后跟省略号是包扩展 (14.5.3(。[示例:

template<class... Args>
void f(Args... args) {
  auto lm = [&, args...] { return g(args...); };
  lm();
}

—结束示例 ]

我认为这涵盖了它。不应用函数的包扩展可以被视为应用标识函数的包扩展。

C++11 §14.5.3/4 in [温度可变]:

包扩展模式和省略号组成,其实例化产生零个或多个 列表中模式的实例化(如下所述(。[...]

也许"函数调用跨参数包扩展"?

让我们区分折叠和映射。折叠将一系列输入数据转换为单个值。映射将一系列输入转换为一系列输出。(当然,映射可以表示为将一系列标量折叠到单个列表(。

在这里,我们将所有输入映射到一个空值。如果我们强调 g(x0(、g(x1( 等的副作用 - 我们可以谈论映射。如果我们强调产生空隙,我们可以谈论纯粹的折叠。但我认为这毫无意义。

std::transform正在映射。 std::accumulate is folding。什么是标准::for_each?映射还是折叠?(顺便说一句,它是折叠的,因为它返回一个具有累积状态的有状态函数对象(。只要输入函数是一元的,而不是二进制的,它就是映射(与折叠融合(。

所以。我想给这个成语"可变参数"。