I'm basically trying to implement a generic observer pattern.
class Observer {
public:
template <class T>
virtual void OnEvent(const EventHandle& h, T& affectedItem) = 0;
};
class Subject {
public:
void AddObserver(Observer* o) {
observers.Add(o);
}
void RemoveObserver(Observer* o) {
observers.Remove(o);
}
template <class T>
void Notify(const EventHandle& h, T& affectedItem) {
for (Observer* o : observers) {
o->OnEvent(h, affectedItem);
}
}
private:
set<Observer*> observers;
};
In Observer::OnEvent()
, I'd like to get the item that had been affected in the event (say I just added something to an inventory and need to reflect the addition in the GUI--I would call Subject::Notify(itemAddedEvent, newItem)
). I know I'll need some refactoring/redesign of classes but I'm stuck on how. What are some ways of getting around this?