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));