Call different member functions on object sequence with a generic handler function?

Timoses timosesu at gmail.com
Fri Jun 29 20:28:55 UTC 2018


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.

Trying to fiddle around a bit with delegates.. But why is the 
context for delegates not working for classes??

https://run.dlang.io/is/Rxeukg

     import std.stdio;

     class Aclass
     {
         int i;
         void foo() { writeln("called ", i); }
     }
     struct Bstruct
     {
         int i;
         void foo() { writeln("called ", i); }
     }


     template callFoo(T)
     {
         alias Dun = void delegate();

         void callFoo(T t)
         {
             Dun fun;
             fun.funcptr = &T.foo;
             fun.ptr = cast(void*)(&t);

             Dun gun;
             gun = &t.foo;

             writeln(fun.ptr, " (fun.ptr of " ~ T.stringof ~ ")");
             writeln(gun.ptr, " (gun.ptr of " ~ T.stringof ~ ")");
             writeln(&t, " (Address of instance (context))");

             fun();
             gun();
         }

     }

     void main()
     {
         auto a = new Aclass();
         a.i = 5;
         auto b = Bstruct();
         b.i = 7;
         writeln("---- Doesn't work ----");
         callFoo(a);
         writeln("\n---- Works ----");
         callFoo(b);
     }


More information about the Digitalmars-d-learn mailing list