1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| template<class CLASS, typename RET=void, typename ARG = void>
class Callback;
class A;
class B
{
public:
B();
~B();
void Display(Callback<A> onAccepted);
};
template<class CLASS, typename RET, typename ARG>
class Callback
{
private:
typedef RET (CLASS::*Function)(ARG);
Function function;
CLASS* owner;
public:
Callback(Function function_, CLASS* that)
:function(function_),owner(that)
{}
~Callback(void){};
RET operator()(ARG a) { return call(a); };
RET call(ARG a) { return (owner->*function)(a); };
};
template<class CLASS, typename RET>
class Callback<CLASS, RET, void>
{
private:
typedef RET (CLASS::*Function)();
Function function;
CLASS* owner;
public:
Callback(Function function_, CLASS* that)
:function(function_),owner(that)
{}
RET operator()() { return call(); };
RET call() { return (owner->*function)(); };
};
B::B()
{
}
B::~B(void)
{
}
void B::Display(Callback<A> onAccepted)
{
onAccepted.call();
}
class A
{
public:
A(void);
~A(void);
void Run();
void Test(Callback<A> onAcceptedCallback);
void OnAccepted();
};
A::A()
{
}
A::~A(void)
{
}
void A::Run()
{
B b;
Callback<A> mycall(&A::OnAccepted, this);
b.Display(mycall);
}
void A::Test(Callback<A> onAcceptedCallback)
{
// Ligne à commenter ou décommenter
onAcceptedCallback();
}
#include <iostream>
void A::OnAccepted()
{
std::cout<<"OnAccepted\n";
}
int main()
{
A a;
a.Run();
a.Test(Callback<A>(&A::OnAccepted, &a));
return 0;
} |
Partager