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;
};




이전에 포스팅했던 서로 다른 클래스간의 함수포인터 호출을 응용....

굳이라능!!

켈켈~
Posted by 명혀니
,