在新指针的构造函数中传递的Lambda函数需要访问该对象

时间:2013-08-31 13:03:46

标签: c++ lambda shared-ptr

我有以下代码:

class A
{
protected:
    int a
public:
    std::function<void()> lambdaFunc;
    A(std::function<void()> lambdaParam) : lambdaFunc(lambdaParam){}
};

int main()
{
    someFunctionCall(std::shared_ptr<A>(new A([](){ /*I need this to access int a*/  }));
}

我不确定如何在这个实例中给lambda函数访问新对象?

1 个答案:

答案 0 :(得分:1)

我建议你明确地将this指针传递给函数,就像这样 (我冒昧地将a公开并将其初始化为0,以简化事情,但它与您的问题无关):

#include <iostream>
#include <functional>
#include <memory>

    class A
    {
    public:
      int a;
    public:
      std::function<void(A& self)> lambdaFunc;
      A(std::function<void(A& self)> lambdaParam) : lambdaFunc(lambdaParam), a(0)
      { /* nothing */ }
    };

    void someFunctionCall(std::shared_ptr<A> p)
    {
      std::cout << p->a << std::endl;
      p->lambdaFunc(*p);
      std::cout << p->a << std::endl;
    }

    int main()
    {
      someFunctionCall(std::shared_ptr<A>(new A([](A&self){ self.a=42; })));
    }

然后,要调用对象a的函数,你必须编写a.lambdaFunc(a),但如果你觉得不方便的话,可以将它包装在一个方法中。

程序(在C ++ 11中)打印0,然后打印42。