1

有一些可观察的类,我天真地使用信号2的方式是提供一个成员信号,以便任何人都可以连接

struct Observable {
  boost::signals2::signal<void(Observable const *)> aSignal;
  void foo() {
    //something happens
    aSignal(this);
  }
};

为了更好的封装,可能会添加一些 publicsubscribe和 hideaSignal以避免外部类调用信号。

现在,问题是该boost::signals2::signal::connect方法是non-const可以理解的,因为连接列表已被修改。但是,这会阻止将信号用于仅观察类,这些类只想对修改做出反应Observable而不修改它。

struct Observer {
  //here I need to pass a non-const Observable
  Observer(Observable * observed) : connection(observed.aSignal.connect(std::bind(this,&Observer::react) {}
  void react(Observable const *) {
    //do something to const Observable
  }
  boost::signals2::scoped_connection connection;
};

解决这个问题的一种方法是让mutable那些发送const thisconst subscribe运行的信号。

struct Observable {
  void foo() {
    //something happens
    aSignal(this);
  }
  template<typename aFoo>
  boost::signals2::connection subscribe(aFoo && foo) const {
    return aSignal.connect(std::forward<aFoo>(foo));
  }
  private:
  mutable boost::signals2::signal<void(Observable const *)> aSignal;
};

那是反模式吗?

另一种解决方法可能是使用允许连接到 const 和非 const Observable 的中间代理类,但是这样我就会失去已经为我准备好的信号的任何优势。

或者我只需要放弃 const 正确性?

或者有什么我想念的?

4

0 回答 0