我使用函数指针作为模板函数的参数,该模板函数将其用作函子。但是,如果我通过调用类的成员变量来定义 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 函数转换为函数指针。