C++ 将捕获作为函数指针的非返回lambda
我的代码(C++)需要将lambda作为函数指针传递。我的lambdas总是:a)返回无效;b) 从不接受任何参数;和c)可以有零个或多个捕获参数。我想将此lambda作为函数指针传递,但无法这样做。有什么建议吗 示例代码:C++ 将捕获作为函数指针的非返回lambda,c++,c++11,C++,C++11,我的代码(C++)需要将lambda作为函数指针传递。我的lambdas总是:a)返回无效;b) 从不接受任何参数;和c)可以有零个或多个捕获参数。我想将此lambda作为函数指针传递,但无法这样做。有什么建议吗 示例代码: void fptrfunc(void (*fptr)()){ fptr(); } int main(){ int x = 2; fptrfunc([](){cout << "LAMBDA CALL--1"<< endl; });
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;
}
void fptrfunc(void(*fptr)(){
fptr();
}
int main(){
int x=2;
fptrfunc([](){coutLambda函数实际上只是函数,即不携带和数据,可以转换为函数指针。要想没有任何数据,捕获必须是空的。签名的其他部分无关紧要:只要类型匹配,就可以分配一个Lambda函数[带有空捕获]指向函数指针
当您的lambda函数需要数据时,您将无法将其转换为函数指针,因为没有地方存储额外的数据。如果您有一个合理的界面,需要传递lambda函数,则可能会传递一些用户数据,通常是void*
。您可以将f辅助函数指针和lambda,可能由适当的<代码> STD::函数< /代码>,由用户数据指向,仍然调用lambda函数。您所想要的,在C++中是不可能的。lambdas捕捉变量不能转换为函数指针。
您需要删除要求c),并且只使用没有捕获的lambdas。或者您必须更改fptrfunc
的声明。您可以将参数类型更改为std::function
,或者将其设置为可以接受实现运算符()的任何类型的functor的模板捕获变量的lambdas不能转换为函数指针。使用STD::函数可以解决C++中的问题(但不是C)你总是想对所有lambda使用相同的函数指针吗?你能给出你不能更改的真实世界界面吗?不仅仅是你的玩具示例吗?你可能缺少一些东西。我正在寻找一个void*
参数或类似的东西。