【问题标题】:Lambda function passed in constructor of new pointer needs access to the object在新指针的构造函数中传递的 Lambda 函数需要访问对象
【发布时间】:2013-08-31 13:03:45
【问题描述】:

我有以下代码:

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 函数访问新对象?

【问题讨论】:

  • 你需要访问哪个对象?
  • 正在创建 A 的新实例。编辑:很清楚,我希望能够将不同的“处理程序”函数传递给不同的实例。
  • 备注:我被推荐使用make_shared()。所以电话会变成someFunctionCall(std::make_shared&lt;A&gt;([](){ /*...*/ }));(顺便说一下,你原来的电话缺少右括号)。
  • 您可以在某个函数调用中使用指向新对象 A 的指针(共享)。如果你想传递另一个handler,你创建一个新的A实例。否则你需要一个setter在类A中。
  • 作为参数传递怎么样:ideone.com/C6eLjY

标签: c++ lambda shared-ptr


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2010-10-31
    • 2018-06-25
    • 2020-05-24
    • 2017-09-29
    • 2014-10-24
    相关资源
    最近更新 更多