digitalmars.D.learn - Helper objects to create delegates
- Jason House (24/24) May 30 2007 I have a multi-threaded application where I pass delegates between
- Daniel Keep (16/43) May 30 2007 static void delegate() create(foo x, int param)
- Jason House (6/44) May 31 2007 ... or very similar. I think I mean to do
I have a multi-threaded application where I pass delegates between threads. While I thought this was a good design in the beginning, I find myself having to create a lot of helper objects... Is there any way to avoid all the extra typing? Any candidate additions to the language that'd help? :) The following results in a run time error: void example(){ foreach(foo x; objectList) passDelegate({x.func(7);}); } The following works but is annoying to keep typing: class Helper{ foo x; int param; this(foo _x, int _param){ x = _x; param = _param; } void opCall(){x.func(param);} } void example(){ foreach(foo x; objectList) passDelegate(&(new Helper(x,7)).opCall); }
May 30 2007
Jason House wrote:I have a multi-threaded application where I pass delegates between threads. While I thought this was a good design in the beginning, I find myself having to create a lot of helper objects... Is there any way to avoid all the extra typing? Any candidate additions to the language that'd help? :) The following results in a run time error: void example(){ foreach(foo x; objectList) passDelegate({x.func(7);}); } The following works but is annoying to keep typing: class Helper{ foo x; int param; this(foo _x, int _param){ x = _x; param = _param; } void opCall(){x.func(param);}static void delegate() create(foo x, int param) { return &(new Helper(x,param)).opCall; }} void example(){ foreach(foo x; objectList) passDelegate(Helper.create(x,7)); }Like that? -- Daniel -- int getRandomNumber() { return 4; // chosen by fair dice roll. // guaranteed to be random. } http://xkcd.com/ v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/
May 30 2007
Daniel Keep wrote:Jason House wrote:... or very similar. I think I mean to do passDelegate( &(new Helper(x,7)).opCall ); I found std.bind which provides the functionality I was looking for. The .ptr() threw me for a loop, but I have it down now. passDelegate( bind(&x.func,7).ptr() );I have a multi-threaded application where I pass delegates between threads. While I thought this was a good design in the beginning, I find myself having to create a lot of helper objects... Is there any way to avoid all the extra typing? Any candidate additions to the language that'd help? :) The following results in a run time error: void example(){ foreach(foo x; objectList) passDelegate({x.func(7);}); } The following works but is annoying to keep typing: class Helper{ foo x; int param; this(foo _x, int _param){ x = _x; param = _param; } void opCall(){x.func(param);}static void delegate() create(foo x, int param) { return &(new Helper(x,param)).opCall; }} void example(){ foreach(foo x; objectList) passDelegate(Helper.create(x,7)); }Like that? -- Daniel
May 31 2007