我的代码(C ++)需要将lambda作为函数指针传递。我的lambdas总是:a)回归无效; b)从不采取任何参数;和c)可以有零个或多个捕获参数。我想将此lambda作为函数指针传递但无法执行此操作。有什么建议吗?
示例代码:
void fptrfunc(void (*fptr)()){
fptr();
}
int main(){
int x = 2;
fptrfunc([](){cout << "LAMBDA CALL--1"<< endl; }); // Works
fptrfunc([x](){cout << "LAMBDA CALL--2"<< endl; }); // Does not compile
return 0;
}
答案 0 :(得分:1)
Lambda函数实际上只是函数,即不携带和数据,可以转换为函数指针。为了没有任何数据清楚,捕获必须是空的。签名的其他部分无关紧要:只要类型匹配,就可以将一个lambda函数[带有空捕获]赋值给函数指针。
当您需要使用lambda函数获取数据时,您将无法将其转换为函数指针,因为无法存储其他数据。如果你有一个合理的接口,你需要传递lambda函数,你可能会传递一些用户数据,通常是void*
。你可以将一个辅助函数指针和一个lambda组合在一起,可能由一个合适的std::function<Sig>
包裹,用户数据指向它仍然可以调用lambda函数。
答案 1 :(得分:1)
你想要什么,在C ++中是不可能的。捕获变量的Lambda不能转换为函数指针。
你需要放弃要求c)并且只使用没有捕获的lambdas。或者您必须更改fptrfunc
的声明。您可以将参数类型更改为std::function
,或使其成为可以接受实现operator()
的任何类型的仿函数的模板。