我正在尝试扩展主题观察者模式以从类而不是静态函数中获取函数。我在Simple Observer Pattern c++11跟随了juan chopanza优秀的例子 现在我想传递一个类成员函数作为注册回调而不是一个简单的函数。
我已经意识到我可以通过使用bind(& class :: member,instance)来调用类成员,如下所示:
class A {
public:
void A_Bar() { std::cout << "A" << m_nTest << "_bar()" << std::endl; }
void A_Foo(int n) { std::cout << "A" << m_nTest << "_Foo(" << n << ")" << std::endl; }
int m_nTest;
};
int main(int argc, _TCHAR* argv[])
{
A A1; A1.m_nTest = 1;
A A2; A2.m_nTest = 2;
Subject<EventType> s;
s.registerObserver(EventType::GREEN, bar);
s.registerObserver(EventType::GREEN, std::bind(&A::A_Bar, A2));
s.registerObserver(EventType::GREEN, std::bind(&A::A_Bar, A1));
s.notify(EventType::GREEN);
}
因为第一个参数on成为调用它的类。我完全得到了我想要的东西:
但是现在我想让通知将一些信息传递给观察者类。因此我将代码修改为以下内容:
template <typename Event>
class Subject
{...
void notify(const Event& event, int nParameter) const
{
for (const auto& obs : observers_.at(event)) obs(nParameter);
}
private:
std::map<Event, std::vector<std::function<void(int)>>> observers_;
};
现在我想注册:
s.registerObserver(EventType::GREEN, std::bind(&A::A_Foo, A2));
任何人都可以帮助我解决我缺少的或如何做到这一点。我真的不想让我的Subject类通过将它添加到函数接口中来了解Observer类。感谢
答案 0 :(得分:0)
使用bind
的代码可能会有问题,因为它会复制对象A2和A1,如果要引用原始对象,可以使用&amp; A2和&amp; A2。要回答您的问题,您可以使用:
s.registerObserver(EventType::GREEN, std::bind(&A::A_Foo, &A2, std::placeholders::_1));
或者使用lambda,我建议:
s.registerObserver(EventType::GREEN, [&](int i){ A2.A_Foo(i); });