xxxxxxxxxx
void main()
{
process!fun();
process2!fun();
}
void process(alias coRoutine, T...)(T params)
{
auto res = coRoutine(params);
pragma(msg, typeof(res));
}
void process2(alias coRoutine, T...)(T params)
{
static if(T.length)
{
pragma(msg, typeof(coRoutine(Map!(init, T))));
}
else
{
pragma(msg, typeof(coRoutine()));
}
}
auto fun(T...)(T params)
{
return 42;
}
// maps a type to its init value
private auto init(T)()
{
return T.init;
}
// ArgCall taken from https://dlang.org/library/std/meta/alias_seq.html
private auto ref ArgCall(alias Func, arg)()
{
return Func!(arg)();
}
// Map taken from https://dlang.org/library/std/meta/alias_seq.html
private template Map(alias Func, args...)
{
static if (args.length > 1)
{
alias Map = AliasSeq!(ArgCall!(Func, args[0]), Map!(Func, args[1 .. $]));
}
else
{
alias Map = ArgCall!(Func, args[0]);
}
}