On Thursday, 6 February 2014 at 22:15:00 UTC, Dicebot wrote:
        assert(!dg.ptr);

Note that Dicebot's version works only because he chose a delegate that points to something that doesn't need an external state. The below method, Foo.dump(), would fail the assert because it requires a reference to an instance of Foo in order to grab the state of a.value or b.value.

It does look like one is allowed to write into the delegate .ptr and .funcptr variables, so reconstructing a delegate from parts is possible. (I'm surprised that the definition of funcptr is "void function()" instead of "void function(Foo)"?).


import std.stdio;

class Foo {
private:
    int value;

public:
    this(int v) {
        value = v;
    }

    void dump() {
        writeln(value);
    }
}

void doDump(void* obj, void function() func) {
    void delegate() dg;
    dg.ptr = obj;
    dg.funcptr = func;
    dg();
}

void main() {
    Foo a = new Foo(42);
    Foo b = new Foo(255);

    auto dgA = &a.dump;
    auto dgB = &b.dump;

    writefln("%x %x", dgA.funcptr, dgB.funcptr); // Same

    void function() func = dgA.funcptr;

    doDump(dgA.ptr, func);
    doDump(dgB.ptr, func);
}

Reply via email to