最近我试图创建灵活的观察者模式实现,它隐藏了boost::signal
. 我几乎成功了。
我有一个Observer
类必须具有update
模板参数提供的方法匹配签名。
使用示例:
Observable<void(float, float)> observable;
Observer<void(float, float)> observer;
observable.attach(&observer);
observable.notify(Observable::Arguments(10.0f, 1.0f)); // invokes observer->update(10.0f, 1.0f);
observer
如果没有重载update
方法,一切正常。在那种情况下boost::bind
不能推断出正确的方法来使用。不幸的是,我不能使用显式转换,因为我不知道更新参数(此信息在 中FunctionSignature
)。
以下方法会导致麻烦:
class Observable <typename FunctionSignature>
{
...
template <class DerivedObserverClass>
void attach(DerivedObserverClass* observer)
{
STATIC_ASSERT((boost::is_base_of<ObserverType, DerivedObserverClass>::value));
ConnectionsMap::iterator it = connections.find(observer);
if (it == connections.end() || !it->second.connected()) {
// i would like to do something like
// boost::function<FunctionSignature> f;
// f = boost::bind(&static_cast<FunctionSignature>DerivedObserverClass::update, observer, _1);
// singnalSlot is defined as boost::signal<FunctionSignature>
// this works as long, as Derived class doesn't have overloaded update method
connections[observer] = signalSlot.connect(boost::bind(&DerivedClass::update, observer, _1));
} else {
throw std::invalid_argument("Observer already attached.");
}
}
我认为这boost::function
可能有助于解决这个问题。我不知道如何仅使用模板签名将其与正确的成员方法绑定。
甚至可能吗?