On Saturday, 30 June 2018 at 00:16:49 UTC, Basile B. wrote:
On Friday, 29 June 2018 at 16:44:36 UTC, Robert M. Münch wrote:
I hope this is understandable... I have:

class C {
        void A();
        void B();
        void C();
}

I'm iterating over a set of objects of class C like:

foreach(obj; my_selected_objs){
        ...
}

The iteration and code before/afterwards always looks the same, I need this iteration for many of the memember functions like C.A() and C.B(), etc.

foreach(obj; my_selected_objs){
        ...
        obj.A|B|C()
        ...
}

So, how can I write a generic handler that does the iteration, where I can specify which member function to call?

void do_A() {
        handler(C.A()); ???
}

void do_B() {
        handler(C.B()); ???
}

handler(???){
        foreach(obj: my_selected_objs){
                ???
        }
}

Viele Grüsse.

Using opDispatch we can manage to get a voldemort able to resolve the member func A, B or C etc.

---
import std.stdio;

class C
{
    void A(){writeln(__FUNCTION__);}
    void B(int i){writeln(__FUNCTION__, " ", i);}
}

auto handler(T)(T t)
{
    struct Handler
    {
        auto opDispatch(string member, Args...)(Args args)
        {
            import std.algorithm.iteration : each;
            mixin( `t.each!(a => a.` ~ member ~ `(args));` );
        }
    }
    Handler h;
    return h;
}

void main()
{
    auto cs = [new C(), new C()];
    handler(cs).A();
    cs.handler.B(42); // UFCS style
}
---

which results a very natural expression.

insert "in" at the right place.

Reply via email to