C ++ lambda - 捕获成员变量

时间:2015-10-03 11:33:20

标签: c++ c++11 lambda

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

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

}

我如何实现“呈现”的行为,例如。读取lambda中的类变量。我可以通过将f传递到内部并编写f.bar.i来绕过它,但这不是一个很好的解决方案。

3 个答案:

答案 0 :(得分:19)

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

f.kernel = [&i = f.bar.i]() -> double { return i * i; };

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

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

虽然传递f并撰写f.bar.i并没有错。

答案 1 :(得分:7)

似乎是you cannot do so。 没有构造来创建成员函数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()

请注意,您无法为两个字段kernel命名。

答案 2 :(得分:0)

lambda函数不知道i或Bar。怎么会知道?您需要传递参考。如果你以不同的方式定义函数体,那么你可以将i作为参数传递,并在类中调用它,你应该得到你想要的。