在 lambda 中使用成员变量时将 lambda 分配给函数指针



我使用函数指针作为模板函数的参数,该模板函数将其用作函子。但是,如果我通过调用类的成员变量来定义 lambda,那么如果我想将其分配给函数指针,编译器会抱怨。

如果 lambda 使用成员变量,如何将 lambda 分配给函数指针?

注意:没有可用的用户定义的转换运算符可以执行 此转换,否则运算符不能调用

  // works
  bool(*arm_check_fcn)(const int &) = [](const int &pt) {
    return pt.m_Part == 3;
  };
  // fails
  bool (*bgr_check_fcn)(const int &) = [this](const int &pt) {
    return _ModelData.GetBackground() == pt;
  };

是的,只有完全没有捕获的无状态 lambda 才能强制到函数指针。如果您需要捕获this(或其他任何内容(,则需要更改目标函数原型,使其模板化:

template<class F> int f(F &&f);

或接受std::function而不是指针:

int f(std::function<bool(int)> const &f);

或任何其他函数对象包装器。

(我已经将参数类型从 std::function 参数中的 const-ref 更改为 int,因为将常量左值引用绑定到标量类型通常几乎没有意义。

函数不包含任何数据,因此不需要存储,只需要指向函数所在地址的指针。由于函数指针仅指向函数,因此没有存储参数的 lambda 可以转换为函数指针。

如果 lambda 对象是函数指针和存储的数据,则必须将数据存储在某个位置。而函数指针不能指向数据和函数。为此,根本不可能将具有捕获数据的 lambda 函数转换为函数指针。

最新更新