有一些可观察的类,我天真地使用信号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 this
和const 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 正确性?
或者有什么我想念的?