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 作为函数参数的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin标准库函数 ② ( run 标准库函数 | run 函数传入 Lambda 表达式作为参数 | run 函数传入函数引用作为参数 )