gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:39:11 24 4
gpt4 key购买 nike

以下观察者类在其构造函数执行时通过调用 attach 向主题注册回调函数。我希望观察者的 dtor 取消注册回调函数。

如何将相同的指针传递给 detach,就像我传递给 attach 一样,以便主体可以将其从观察者列表中删除?

我在想我必须将一个 shared_ptr 存储到 this 但我不确定我是如何从那个到 shared_ptr到成员函数回调

有人能帮忙吗?

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总是返回一个新的 shared_ptr每次调用它时,因为它的目的是“使用以下参数创建一个新对象并返回一个 shared_ptr 给它”。大致相当于shared_ptr(new std::function<void()> (std::bind(&Observer::callback, this)) .之所以多了一个make_shared函数是最小化分配并保证长表达式中的异常安全。如果您只想共享一个对象,那么只需分发您的 shared_ptr拷贝 .

关于c++ - 将 shared_ptr 传递给 std::function(成员函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33562942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com