绑定类函数观测器c++11

bind class function observer c++11

本文关键字:c++11 观测器 类函数 绑定      更新时间:2023-10-16

我正在尝试扩展主题观察器模式,以从类中获取函数,而不是静态函数。我在简单观察者模式c++11中学习了juan chopanza的优秀例子现在我想传递一个类成员函数作为注册回调,而不是一个简单的函数。

我已经意识到,我可以通过使用绑定(&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);
}

由于上的第一个参数成为调用它的类。我得到了我想要的东西:

  • bar()
  • A2_bar()
  • A1_bar()

但现在我也想让notify将一些信息传递给observer类。因此,我将代码修改为:

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));

有人能帮我找出我缺少的东西或如何做到这一点吗。我真的不想通过将Observer类添加到函数接口中来让Subject类了解它。感谢

使用bind的代码可能会有问题,因为它复制了对象A2和A1,您可以使用&A2和&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); });