将 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
}
attach
和detach
声明如下:
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 的成员。
以下观察者 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
}
attach
和detach
声明如下:
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 的成员。