非返回lambda,捕获为函数指针

时间:2014-05-24 18:57:49

标签: 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; });            // Works
  fptrfunc([x](){cout << "LAMBDA CALL--2"<< endl; });           // Does not compile
  return 0;
} 

2 个答案:

答案 0 :(得分:1)

Lambda函数实际上只是函数,即不携带和数据,可以转换为函数指针。为了没有任何数据清楚,捕获必须是空的。签名的其他部分无关紧要:只要类型匹配,就可以将一个lambda函数[带有空捕获]赋值给函数指针。

当您需要使用lambda函数获取数据时,您将无法将其转换为函数指针,因为无法存储其他数据。如果你有一个合理的接口,你需要传递lambda函数,你可能会传递一些用户数据,通常是void*。你可以将一个辅助函数指针和一个lambda组合在一起,可能由一个合适的std::function<Sig>包裹,用户数据指向它仍然可以调用lambda函数。

答案 1 :(得分:1)

你想要什么,在C ++中是不可能的。捕获变量的Lambda不能转换为函数指针。

你需要放弃要求c)并且只使用没有捕获的lambdas。或者您必须更改fptrfunc的声明。您可以将参数类型更改为std::function,或使其成为可以接受实现operator()的任何类型的仿函数的模板。