On 03.07.19 20:20, Robert M. Münch wrote:
So, I need to carry around the object from which a delegate was created from because it's not possible to query the delegate for the object later somewhere else in the code.

It is possible to get the context object out of a delegate:

----
class C { void method() {} }
void main()
{
    auto c = new C;
    void delegate() dg = &c.method;
    assert(cast(C) dg.ptr is c); /* passes */
}
----

You just have to know (or carry around) the type so that you can cast correctly.

[...]
myObject[string] myObjectArray;

auto mo1 = makeMyStruct!myClassA(mcA, &mcA.myClassFunc); // mo1 = myObject
auto mo2 = makeMyStruct!myClassB(mcB, &mcA.myClassFunc); // mo2 = myObject

myObjectArray["1"] = mo1;
myObjectArray["2"] = mo2;

assert(mcA == mo1._context)
assert(mcA == myObjectArray["1"]._context)

class MyClassA { void myClassFunc() {} }
class MyClassB { void myClassFunc() {} }

void main()
{
    void delegate()[string] myDelegateArray;

    auto mcA = new MyClassA;
    auto mcB = new MyClassB;

    auto dg1 = &mcA.myClassFunc;
    auto dg2 = &mcB.myClassFunc;

    myDelegateArray["1"] = dg1;
    myDelegateArray["2"] = dg2;

    assert(mcA is cast(MyClassA) dg1.ptr); /* passes */
    assert(mcA is cast(MyClassA) myDelegateArray["1"].ptr); /* passes */

    /* When void* is good enough, you can use .ptr without a cast: */
    assert(dg2.ptr is myDelegateArray["2"].ptr); /* passes */
}

Reply via email to