Lambda 作为函数参数

Posted

技术标签:

【中文标题】Lambda 作为函数参数【英文标题】:Lambda as function parameter 【发布时间】:2011-12-27 22:00:20 【问题描述】:

在不使用 auto 或模板的情况下声明 lambda 变量或函数参数的符号是​​什么?有什么办法吗?或者编译器是否为每个在编译时程序员不知道名称的 lambda 定义了一个唯一的类对象?如果是这样,为什么?它们不能作为某种函数指针传递吗?如果这不可能,那将是一个巨大的失望。

【问题讨论】:

"如果不可能,那将是一个巨大的失望。" 为什么?这怎么可能有用? @ildjarn 对于运行时 lambda! 【参考方案1】:

Lambda 可以保持状态(如从周围上下文中捕获的引用);如果没有,它们可以存储在函数指针中。如果有,则必须将它们存储为函数对象(因为函数指针中没有保存状态的位置)。

// No state, can be a function pointer:
int (*func_pointer) (int) = [](int a)  return a; ;

// One with state:
int b = 3;
std::function<int (int)> func_obj = [&](int a)  return a*b; ;

【讨论】:

哦,我明白了。所以这就是为什么它们是未确定类型的,因为它们可能是一个带有几个成员变量的函数对象? 我怀疑有一个不确定的类型更像是 C++ 标准的东西; IIRC,c ++中的大多数文字实际上并没有定义的“类型”,而是可以转换为不同类型的文字(例如,字符串文字不是 const char *。它可以变成 const char * 或字符 *)。我怀疑这给实现带来了一些回旋余地?但当然,这样做的好处之一是它允许文字变成多种类型。 (其中一些是关于标准的摇摇欲坠的记忆,所以请读者注意) 实际上字符串字面量是const char[N],其中 N 是其中的字符数加一。 第二种解决方案似乎确实违反了问题的“没有模板”部分。但是,这是不可避免的:无法命名 lambda 的类型,因此您必须使用 standard 转换为另一种类型或使用模板。 (用户定义的非模板转换也不能命名 lambda 源类型)。因此,碰巧从不涉及模板的 lambda 类型转换为函数指针。【参考方案2】:

您可以使用polymorphic wrapper for a function object。例如:

#include <functional>

std::function<double (double, double)> f = [](double a, double b)  return a*b ;

【讨论】:

以上是关于Lambda 作为函数参数的主要内容,如果未能解决你的问题,请参考以下文章

Lambda 作为函数参数

Kotlin标准库函数 ② ( run 标准库函数 | run 函数传入 Lambda 表达式作为参数 | run 函数传入函数引用作为参数 )

将 lambda 作为模板参数传递给函数指针函数模板化

嵌入传递 lambda 函数作为回调参数

如何传递和使用任意lambda函数作为参数[重复]

使用 lambda 作为 C++ 函数的参数