On Wednesday, 30 August 2017 at 15:35:57 UTC, bitwise wrote:
-What if I want an event to lock a shared mutex of the enclosing object, without storing a pointer to that mutex inside the event itself (and every single other event in the object)?

-What if I want an event to call a method of the enclosing object when a handler is added (without keeping a pointer to it inside the actual event)?

So in essence, you'd like something like this to work, right?

struct Event(alias __parent, Handler) {
    enum parentHasLock = __traits(compiles, __parent.lock());
    ...
    void opCall()(Parameters!Handler args)
    {
        static if (parentHasLock)
            __parent.lock();
        ...
    }
}

struct Host1 {
    Event!Handler onChanged;
    Event!Handler onClosed;
}

and have the compiler internally instantiate something like

Event!(/* parent type */ Host1, /* .offsetof in parent in order to deduce the __parent address from Event's &this */ 0, Handler)
Event!(Host1, N, Handler)

Reply via email to