如何创建用捕获的变量包装 lambda 的函子?

mak*_*mak 5 c++ lambda functor c++14

如何更改下面的函子以用作 lambda 包装器?

template<typename T>
class F {
  T f;
public:
  F(T t){
      f = t;
  }
  T& operator()(){
    return f;
  }
};

int main()
{
    int x = 5;
    F<int (*)(int, int)> f( [x](int a, int b){return a+b;} );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器说

error: no matching function for call to 'F<int (*)(int, int)>::F(main()::<lambda(int, int)>)'
     F<int (*)(int, int)> f( [x](int a, int b){return a+b;} );
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 1

如果 lambda 仅仅因为它们是两个不同的东西而捕获某些东西,则它不能直接转换为自由函数指针。

具有捕获值的 lambda 必须将其状态保存在某处,但函数指针只是一个内存地址,因此它不提供该功能。所以你会被允许做某事

static_cast<int(*)(int,int)>([](int a, int b) { return a+b; })
Run Code Online (Sandbox Code Playgroud)

但这不是你的情况。

一些解决方案可能是:

  • 不要使用函数指针,而使用 astd::function<int(int,int>)代替
  • 提供一个调用 lambda 的自由函数(在您的情况下这不是一个好的解决方案,主要是用于与遗留代码进行接口,我想说
  • 使用模板函数,它本身提供从 lambda 到函数指针的包装。类似于这里提出的解决方案