template class Core::ObserverList
Overview
Template list of observer objects for easy Observer pattern implementation. More…
#include <coreobserver.h> template <class T> class ObserverList { public: // methods bool isEmpty () const; bool contains (T* observer); void addObserver (T* observer); void removeObserver (T* observer); template <typename S> void notify (void (S::*) () notification); template <typename S, typename Arg1> void notify ( void (S::*) (Arg1) notification, typename Args::ArgType <Arg1>::type argument1 ); template <typename S, typename Arg1, typename Arg2> void notify ( void (S::*) (Arg1, Arg2) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2 ); template <typename S, typename Arg1, typename Arg2, typename Arg3> void notify ( void (S::*) (Arg1, Arg2, Arg3) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2, typename Args::ArgType <Arg3>::type argument3 ); template <typename S, typename Arg1, typename Arg2, typename Arg3, typename Arg4> void notify ( void (S::*) (Arg1, Arg2, Arg3, Arg4) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2, typename Args::ArgType <Arg3>::type argument3, typename Args::ArgType <Arg4>::type argument4 ); template < typename S, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5 > void notify ( void (S::*) (Arg1, Arg2, Arg3, Arg4, Arg5) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2, typename Args::ArgType <Arg3>::type argument3, typename Args::ArgType <Arg4>::type argument4, typename Args::ArgType <Arg5>::type argument5 ); template < typename S, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6 > void notify ( void (S::*) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2, typename Args::ArgType <Arg3>::type argument3, typename Args::ArgType <Arg4>::type argument4, typename Args::ArgType <Arg5>::type argument5, typename Args::ArgType <Arg6>::type argument6 ); };
Detailed Documentation
Template list of observer objects for easy Observer pattern implementation.
ObserverList and the associated DEFINE_OBSERVER macro can be used to simplify the use of observers and observer notification.
Simply add DEFINE_OBSERVER to your class header, which will add an ObserverList object named ‘observers’ and stub out addObserver() and removeObserver() for your observer class type.
Then, when you want to notify observers call an appropriate notify() method.
example:
class SomeClass;
struct SomeObserver { virtual void someSimpleNotification () = 0; virtual void someNotification (int someParam, SomeClass* otherParam) = 0; };
class SomeClass { public: …
DEFINE_OBSERVER (SomeObserver)
void doStuff () { observers.notify (&SomeObserver::someSimpleNotification); or … observers.notify (&SomeObserver::someNotification, 123, this); } };
class MyObserver: public SomeObserver { public: MyObserver (SomeClass& notifier) { notifier.addObserver (this); // notify us when something changes }
SomeObserver void someNotification (int someParam, SomeClass* notifier) { we got notified! } };
Methods
bool isEmpty () const
Check if list is empty.
bool contains (T* observer)
Check if list contains given observer.
void addObserver (T* observer)
Add observer to list.
void removeObserver (T* observer)
Remove observer from list.
template <typename S> void notify (void (S::*) () notification)
Call method on all observers (no arguments).
template <typename S, typename Arg1> void notify ( void (S::*) (Arg1) notification, typename Args::ArgType <Arg1>::type argument1 )
Call method on all observers (one argument).
template <typename S, typename Arg1, typename Arg2> void notify ( void (S::*) (Arg1, Arg2) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2 )
Call method on all observers (two arguments).
template <typename S, typename Arg1, typename Arg2, typename Arg3> void notify ( void (S::*) (Arg1, Arg2, Arg3) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2, typename Args::ArgType <Arg3>::type argument3 )
Call method on all observers (three arguments).
template <typename S, typename Arg1, typename Arg2, typename Arg3, typename Arg4> void notify ( void (S::*) (Arg1, Arg2, Arg3, Arg4) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2, typename Args::ArgType <Arg3>::type argument3, typename Args::ArgType <Arg4>::type argument4 )
Call method on all observers (four arguments).
template < typename S, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5 > void notify ( void (S::*) (Arg1, Arg2, Arg3, Arg4, Arg5) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2, typename Args::ArgType <Arg3>::type argument3, typename Args::ArgType <Arg4>::type argument4, typename Args::ArgType <Arg5>::type argument5 )
Call method on all observers (five arguments).
template < typename S, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6 > void notify ( void (S::*) (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) notification, typename Args::ArgType <Arg1>::type argument1, typename Args::ArgType <Arg2>::type argument2, typename Args::ArgType <Arg3>::type argument3, typename Args::ArgType <Arg4>::type argument4, typename Args::ArgType <Arg5>::type argument5, typename Args::ArgType <Arg6>::type argument6 )
Call method on all observers (six arguments).