Skip to content

Instantly share code, notes, and snippets.

@BlockoS
Created December 13, 2011 21:06
Show Gist options
  • Save BlockoS/1473889 to your computer and use it in GitHub Desktop.
Save BlockoS/1473889 to your computer and use it in GitHub Desktop.
Callback deluxe
class Callback
{
public:
Callback() {}
virtual ~Callback();
virtual void onMouseMove(int x, int y) = 0;
};
template <typename T>
class CallbackDeluxe : Callback
{
typedef void (T::*TMouseMoveProc) (int x, int y);
public:
CallbackDeluxe(T* instance, TMethod proc) : m_instance(instance), m_proc(proc) {}
virtual ~CallbackDeluxe() {}
virtual void onMouseMove(int x, int y)
{
(m_instance.*m_proc)(x, y);
}
protected:
T* m_instance;
TMouseMoveProc m_proc;
};
class Input
{
public:
void RegisterCallback(Callback* callback)
{
m_callback = callback;
}
template <typename T>
void RegisterCallback(T* instance, void (T::*proc) (int x, int y))
{
m_callback = new CallbackDeluxe(instance, proc); // LEAK \o/
}
void onMouseMove(int x, int y)
{
m_callback->onMouseMove(x, y);
}
protected:
Callback *m_callback;
};
class Bozo
{
public:
void Pouet(int x, int y)
{
printf("%d %d\n", x, y);
}
};
int main()
{
Input in;
Bozo foo;
in.Register(&foo, &(Bozo::Pouet));
in.onMouseMove(1, 4);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment