Thread overview |
---|
September 05, 2016 Assign any event kind to a single templatized function ? | ||||
---|---|---|---|---|
| ||||
It's almost a "yeah". However this doesn't work with ref parameters. Any idea how to make this work, keeping the simplicity of the concept ? °°°°°°°°°°°°°°°°°°°°°°°°°°°°°° module runnable; import std.stdio; struct Foo { void delegate(int) event1; void delegate(int,int) event2; void delegate(int,ref int) event3; } struct Handler { void handle(A...)(A a){writeln(a);} void handleref(A...)(/*auto ref*/ A a){writeln(a);} } void main(string[] args) { import std.traits; Foo foo; Handler handler; foo.event1 = &handler.handle!(Parameters!(foo.event1)); foo.event2 = &handler.handle!(Parameters!(foo.event2)); foo.event3 = &handler.handleref!(Parameters!(foo.event2)); // ? } °°°°°°°°°°°°°°°°°°°°°°°°°°°°°° |
September 05, 2016 Re: Assign any event kind to a single templatized function ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Basile B. | On Monday, 5 September 2016 at 13:44:53 UTC, Basile B. wrote:
Typo, last line should be:
>
> foo.event3 = &handler.handleref!(Parameters!(foo.event3));
>
But it still doesnt work.
|
September 05, 2016 Re: Assign any event kind to a single templatized function ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Basile B. | On 09/05/2016 03:44 PM, Basile B. wrote: > °°°°°°°°°°°°°°°°°°°°°°°°°°°°°° > module runnable; > > import std.stdio; > > struct Foo > { > void delegate(int) event1; > void delegate(int,int) event2; > void delegate(int,ref int) event3; > } > > struct Handler > { > void handle(A...)(A a){writeln(a);} > void handleref(A...)(/*auto ref*/ A a){writeln(a);} > } > > void main(string[] args) > { > import std.traits; > Foo foo; > Handler handler; > foo.event1 = &handler.handle!(Parameters!(foo.event1)); > foo.event2 = &handler.handle!(Parameters!(foo.event2)); > foo.event3 = &handler.handleref!(Parameters!(foo.event2)); // ? > } > °°°°°°°°°°°°°°°°°°°°°°°°°°°°°° You can pass the delegate type itself by alias. Then Parameters carries over the ref. Not sure if that's well-defined or if it just happens to work. void handlef(F)(Parameters!F a){writeln(a);} ... foo.event3 = &handler.handlef!(typeof(foo.event3)); |
September 05, 2016 Re: Assign any event kind to a single templatized function ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | On 09/05/2016 04:00 PM, ag0aep6g wrote: > You can pass the delegate type itself by alias. [...] > void handlef(F)(Parameters!F a){writeln(a);} Don't know why I wrote "by alias". Clearly no alias there. |
September 05, 2016 Re: Assign any event kind to a single templatized function ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | On Monday, 5 September 2016 at 14:00:04 UTC, ag0aep6g wrote:
> On 09/05/2016 03:44 PM, Basile B. wrote:
>> [...]
>
> You can pass the delegate type itself by alias. Then Parameters carries over the ref. Not sure if that's well-defined or if it just happens to work.
>
>
> void handlef(F)(Parameters!F a){writeln(a);}
> ...
> foo.event3 = &handler.handlef!(typeof(foo.event3));
Nice !
|
Copyright © 1999-2021 by the D Language Foundation