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

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

【问题讨论】:

  • "如果不可能,那将是一个巨大的失望。" 为什么?这怎么可能有用?
  • @ildjarn 对于运行时 lambda!

标签: c++ lambda c++11


【解决方案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 };

【讨论】: