C++ lambda - 捕获成员变量

Mar*_*rry 14 c++ lambda c++11

我有一个类,它具有指向内核函数的函数指针,可以从外部改变.

class Bar 
{
   public:
     int i;
}

class Foo 
{
   public:
     std::function<double()> kernel;
     Bar bar;         
};

int main()
{

  Foo f;
  f.kernel = []() -> double { return i * i; }; //this is not working obviously

}
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现"呈现"的行为,例如.读取lambda中的类变量.我可以通过传入f内部并写入来绕过它f.bar.i,但这不是一个很好的解决方案.

asl*_*slg 19

在C++ 14中你可以把它写成,

f.kernel = [&i = f.bar.i]() -> double { return i * i; };
Run Code Online (Sandbox Code Playgroud)

如果你没有C++ 14,你也可以创建另一个变量,

int &i = f.bar.i;
f.kernel = [&i]() -> double { return i*i; };
Run Code Online (Sandbox Code Playgroud)

虽然传球f和写作都没有错f.bar.i.


dhk*_*hke 7

看来你不能这样做.没有构造来创建成员函数lambda.

但你可能可以按照@ KerrekSB的建议,除了调度之外,还可以获得成员函数:

class Foo 
{
public:
    double kernel()
    {
        _kernel(*this);
    }

    std::function<double(Foo &)> _kernel;
};


Foo f;
f._kernel = [](Foo &f) -> double { return f.i * f.i; };
f.kernel()
Run Code Online (Sandbox Code Playgroud)

请注意,您不能为这两个字段命名kernel.