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

时间:2018-01-17 12:17:43

标签: c++11 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;
  };

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

是的,只有一个没有捕获的无状态lambda可以被强制转换为函数指针。如果你需要捕获this(或其他任何东西),你需要更改目标函数proto,使其模板化:

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

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

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

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

(我已经从int参数中的const-ref将参数类型更改为std::function,因为将const lvalue refs绑定到标量类型通常几乎没有任何意义。)< / p>