如何调用使用数组将函数应用于可变参数包的成语
How to call the idiom of using an array to apply a function to a variadic pack
这是有问题的成语:
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?映射还是折叠?(顺便说一句,它是折叠的,因为它返回一个具有累积状态的有状态函数对象(。只要输入函数是一元的,而不是二进制的,它就是映射(与折叠融合(。
所以。我想给这个成语"可变参数"。
- c++r值引用应用于函数指针
- 如何将记忆应用于此递归函数?
- 应用于运算符而不是构造函数的显式关键字
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 模板包扩展以将函数应用于连续的参数对
- 将函数应用于特征矩阵中的所有元素,而无需循环
- STD ::在模板函数中应用于构造函数
- 如何将函数逐列应用于特征矩阵?
- 可以将属性应用于构造函数参数
- C 如何将函数应用于向量元素
- 'ShowSUM':__declspec(dllexport)不能应用于具有__clrcall调用约定的函数
- 用于将参数应用于函数的模板函数
- C++:将参数应用于函数范围
- std::move 如何应用于函数返回值
- 我可以告诉 nvcc 将 #pragma 展开应用于函数中的所有循环吗?
- C++将标准库算法应用于函数
- 警告 C4180:应用于函数类型的限定符没有意义;忽视
- 将增量运算符应用于函数
- 将using语句应用于函数的返回类型,而不应用于整个命名空间