On 2012-05-03 20:46, Gor Gyolchanyan wrote:
I need to get a pointer to a virtual method, which is in turn a
function pointer, being set by virtual method binding.
Can anyone, please, tell me how to get it? Taking the delegate of the
method won't do, because I need it to behave exactly as a virtual
method call, except I pass the "this" explicitly.
I need this in an event handling mechanism I'm making. You derive from
the Sink class, passing your static type to the constructor, which
scans your virtual methods, that conform to specific requirements and
extracts them into an array, which later uses to dispatch the incoming
events.
It will feel much like a run-time virtual template method.

You can use two delegates:

class Foo
{
    void bar ()
    {
        writeln("Foo");
    }

    void delegate () resolveVirtualCall ()
    {
        return &bar;
    }

    static void forwardVirtualCall (Foo object)
    {
        void delegate () delegate () dg;
        dg.ptr = cast(void*) object;
        dg.funcptr = &resolveVirtualCall;
        dg()();
    }
}

class Bar : Foo
{
    void bar ()
    {
        writeln("Bar");
    }
}

void main()
{
    Foo b = new Bar;
    Foo.forwardVirtualCall(b);
}

Will print "Bar". If "resolveVirtualCall" is not used and "bar" is used directly instead, it will print "Foo".

--
/Jacob Carlborg

Reply via email to