Prosta klasa dla callbacków.
Kod:
#include <vector>
template<class RT, class AT, class OT>
class Callback
{
typedef RT (*tCallbackF)(AT arg);
typedef RT (OT::*tCallbackM)(AT arg);
typedef std::vector<tCallbackF> tCallbackListF;
typedef std::pair<OT*,tCallbackM> tCallbackMp;
typedef std::vector<tCallbackMp> tCallbackListM;
tCallbackListF m_callbackListF;
tCallbackListM m_callbackListM;
public:
void registerListener(OT*, tCallbackM method);
void registerListener(tCallbackF method);
void notify(AT arg);
};
template<class RT, class AT, class OT>
void Callback<RT, AT, OT>::notify(AT arg)
{
for (auto f : m_callbackListF)
f(arg);
for (auto m : m_callbackListM)
(m.first->*m.second)(arg);
}
template<class RT, class AT, class OT>
void Callback<RT, AT, OT>::registerListener(tCallbackF method)
{
m_callbackListF.push_back(method);
}
template<class RT, class AT, class OT>
void Callback<RT, AT, OT>::registerListener(OT* obj, tCallbackM method)
{
tCallbackMp pair(obj, method);
m_callbackListM.push_back(pair);
}
Oraz użycie:
Kod:
#include "Callback.h"
class Test
{
public:
Test() { }
void foo(int x) { std::cout << "Test::foo() called: " << x << std::endl; }
};
void bar(int x)
{
{ std::cout << "bar() called: " << x << std::endl; }
}
int main()
{
Test test;
Callback<void, int, Test> callback;
callback.registerListener(&test, &Test::foo);
callback.registerListener(&bar);
callback.notify(10);
return 0;
}
Zakładki