I have double dispatcher:

template Dispatcher(R)
{
R execute(Left,Right)(R delegate(Left,Right) f,Object left,Object right)
        {
                return f(cast(Left)left,cast(Right)right);
        }
        struct Dispatcher
        {
private R delegate(Object,Object)[Tuple!(TypeInfo_Class,TypeInfo_Class)] m_callbacks;
                void add(Left,Right)(R delegate(Left,Right) f)
                {
m_callbacks[tuple(Left.classinfo,Right.classinfo)] = (Object l,Object r){return execute!(Left,Right)(f,l,r);};
                }
                void remove(Left,Right)()
                {
                        
m_callbacks.remove(tuple(Left.classinfo,Right.classinfo));
                }
                R opCall(Object l,Object r)
                {
R delegate(Object,Object)* callback = tuple(l.classinfo,r.classinfo) in m_callbacks;
                        return (*callback)(l,r);
                }
        }
}

And I have some class ierarhy:

class GameObject
{
}

class Foo : GameObject
{
}

class Bar : GameObject
{
}

problem is to create some wrapper to this classes

struct GameHandle(Type)

and this code work


void main()
{
        Dispatcher!void d;
        
d.add!(GameHandle!Foo,GameHandle!Bar)((GameHandle!Foo,GameHandle!Bar){writeln("haha");});
        GameHandle!GameObject a;a.m_hold = new Foo;
        GameHandle!GameObject b;b.m_hold = new Bar;
        d(a,c);
        readln();
}

Reply via email to