#include <iostream>
using namespace std;

class Foo{
	public:
	void bar(){
		cout << "Foo called\n";
	}
};


class Foo2{
	public:
	void bar2(){
		cout << "Foo2 called\n";
	}
};

class Function{
	public:
    virtual void call()=0;
};


template<typename T>
class TemplatedFunction : public Function{
	public:
	void (T::*m_fkt)();
	T* m_obj;

    TemplatedFunction(T* obj, void (T::*fkt)()):m_fkt(fkt),m_obj(obj){}

    void call(){
      (m_obj->*m_fkt)();
    }
};

class EventHandler{
	public:
	Function* m_func=nullptr;
	
	template<class T> 
	void SetCallbackFunction(T* obj, void (T::*mem_fkt)()){
		if(m_func != nullptr)
			delete m_func;
		m_func = new TemplatedFunction<T>(obj,mem_fkt);
	}
	
	void TestCallback(){
		if(m_func != nullptr)
			m_func->call();
	}
	
	~EventHandler(){
		if(m_func != nullptr)
			delete m_func;
	}
};

int main() {
	EventHandler eh;
	Foo foo;
	Foo2 foo2;
	eh.SetCallbackFunction(&foo, &Foo::bar);
	eh.TestCallback();
	eh.SetCallbackFunction(&foo2, &Foo2::bar2);
	eh.TestCallback();
	return 0;
}