Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将捕获作为函数指针的非返回lambda_C++_C++11 - Fatal编程技术网

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; });

我的代码(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;
} 
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*
参数或类似的东西。