All pastes #675220 Raw Edit

Unnamed

public text v1 · immutable
#675220 ·published 2007-08-29 22:21 UTC
rendered paste body
class Base;
class Child;
class B;
class C;

template<class Class, typename ParamType>
class Callback
{
private:
    typedef void (Class::*Method)(ParamType);
    Method m_method;
public:
    Callback(Method method) : m_method(method) {}
    void Execute(Class *c, ParamType p) { (c->*m_method)(p); }
};

class A
{
public:
    virtual void Call(Child *obj, Callback<Child, B*> cb, Callback<Child, C*> cc) = 0;
};

class B : public A
{
public:
    void Call(Child *obj, Callback<Child, B*> cb, Callback<Child, C*> cc)
    {
        cb.Execute(obj, this);
    }
};

class C : public A
{
public:
    void Call(Child *obj, Callback<Child, B*> cb, Callback<Child, C*> cc)
    {
        cc.Execute(obj, this);
    }
};

class Base
{
protected:
    virtual void F1(A *p) = 0;
};

class Child : public Base {
public:
    void F1(A *p)
    {
        p->Call(this, Callback<Child, B*>(&Child::F1B), Callback<Child, C*>(&Child::F1C));
    }

    void F1B(B *p) { printf("Child B!\n"); }
    void F1C(C *p) { printf("Child C!\n"); }
};

void main()
{
    Child x;
    B b;
    x.F1(&b);
    C c;
    x.F1(&c);
    getch();
}