template <class T, class T_ObjReturn> class CallFunc { public: CallFunc(T_ObjReturn (T::*pfunc)(int, float, void*), int nparam, float fparam, void* lparam) : IFunc(pfunc), nParam(nparam), fParam(fparam), lParam(lparam) { } T_ObjReturn operator()(T *pClass) const { return ((pClass->*IFunc)(nParam, fParam, lParam)); } private: T_ObjReturn (T::*IFunc)(int, float, void*); int nParam; float fParam; void* lParam; }; template <class T> class CObservable { public: CObservable() {} virtual ~CObservable() { m_listObserve.clear(); } void addObserveObj (T* obj){ m_listObserve.push_back(obj); } void removeObserveObj(T* obj){ m_listObserve.remove(obj); } void removeObserveAll() { m_listObserve.clear(); } ///------------------------------------------------------------------------- protected: template <class T_ObjReturn> void ObserveCall(T_ObjReturn (T::*pfunc)(int, float, void*), int nparam = 0, float fparam = 0, void* lparam = 0) { std::for_each( m_listObserve.begin(), m_listObserve.end(), CallFunc<T, T_ObjReturn>(pfunc, nparam, fparam, lparam)); } ///------------------------------------------------------------------------- protected: std::list<T*> m_listObserve; }; class IEventObservable { public: IEventObservable() {} virtual ~IEventObservable() {} virtual void ContextCall(int nparam, float fparam, void* lparam) = 0; };
이전에 포스팅했던 서로 다른 클래스간의 함수포인터 호출을 응용....
굳이라능!!
켈켈~