将 shared_ptr 传递给 std::function(成员函数)

Passing shared_ptr to std::function (member function)

以下观察者 class 通过调用 attach 在其 ctor 执行时向主题注册回调函数。我希望观察者的dtor注销回调函数。

如何将与 attach 相同的指针传递给 detach,以便主题可以将其从其观察者列表中删除?

我在想我必须将 shared_ptr 存储到 this 但我不确定如何从 shared_ptr 到成员函数 callback.

有人能帮忙吗?

Observer::Observer(Subject& subject) : m_subject(subject),
{
    m_subject.attach("cmd", std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this)));
}

Observer::~Observer()
{
    // I tried this initially but realised that the pointer below
    // is different to the one passed to `attach` from the ctor.

    m_subject.detach("cmd", std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this)));
}

void Observer::callback()
{
    // do some stuff
}

attachdetach声明如下:

void Subject::attach(const std::string& command, const std::shared_ptr<std::function<void()>>& callback);

void Subject::detach(const std::string& command, const std::shared_ptr<std::function<void()>>& callback);

我建议也将 shared_ptr 的副本存储在您的观察者 class 中,也许作为成员。然后你可以将相同的指针指向 detach.

像这样:

class Observer {
    //Other Stuff here

private:
    std::shared_ptr<std::function<void()>> callback_ptr;
};

Observer::Observer(Subject& subject) : 
m_subject(subject), 
callback_ptr(std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this))
{
    m_subject.attach("cmd", std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this)));
}

Observer::~Observer()
{
    m_subject.detach("cmd", callback_ptr));
}

值得注意的是,正如@dkg 还提到的,make_shared 每次调用时总是 return 一个新的 shared_ptr,因为它的目的是 "create a new object with the following parameters and return a shared_ptr to it".大致相当于shared_ptr(new std::function<void()> (std::bind(&Observer::callback, this))。 之所以有一个额外的 make_shared 函数是为了最小化分配并保证长表达式中的异常安全。 如果您只想共享一个对象,那么只需分发您的 shared_ptr.

副本

每次您调用 std::make_shared 它都会为您分配并构造一个新对象。

在你的代码中,你调用它两次,然后你有两个不相同的对象实例。

您可以调用它一次并将共享指针保留为您的 class 的成员。