我使用函数指针作为模板函数的参数,该函数使用它作为仿函数。但是,如果我通过调用类的成员变量来定义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;
};
答案 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>