【问题标题】:non returning lambda with captures as function pointer以捕获作为函数指针的非返回 lambda
【发布时间】:2014-05-24 18:57:49
【问题描述】:

我的代码 (C++) 需要将 lambda 作为函数指针传递。我的 lambdas 总是:a)返回 void; 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;
} 

【问题讨论】:

  • 捕获变量的 Lambda 不能转换为函数指针。
  • 使用 std::function 可能会解决 C++ 中的问题(但不是 C)
  • 您是否总是希望对所有 lambda 表达式使用相同的函数指针?
  • 能不能给出你无法改变的真实世界界面?不只是你的玩具例子?您可能缺少某些东西。我正在寻找 void* 参数或类似的东西。

标签: c++ c++11


【解决方案1】:

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

当您需要使用 lambda 函数获取数据时,您将无法将其转换为函数指针,因为没有地方可以存储额外的数据。如果您有一个需要传递 lambda 函数的合理接口,您可能会传递一些用户数据,通常是 void*。您可以将辅助函数指针和 lambda 组合起来,可能由合适的 std::function&lt;Sig&gt; 包装,由用户数据指向仍然调用 lambda 函数。

【讨论】:

    【解决方案2】:

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

    您需要放弃要求 c) 并且只使用不带捕获的 lambda。或者您必须更改fptrfunc 的声明。您可以将参数类型更改为 std::function 或将其设置为可以接受任何类型的实现 operator() 的函子的模板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 2020-01-13
      • 2020-06-11
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      相关资源
      最近更新 更多