Shin Fujishiro: > import std.conv; > > auto ref reverseArgs(alias fun, Args...)(auto ref Args args) > { > return mixin( > { > string rargs; > foreach (i, Arg; Args) > { > if (i > 0) > rargs ~= ", "; > rargs ~= "args[" ~ to!string(args.length - i - 1) ~ "]"; > } > return "fun(" ~ rargs ~ ")"; > }()); > } > > void main() > { > int div(int a, int b) { return a / b; } > > assert(reverseArgs!div(3, 27) == 9); > }
I think this is more readable (not tested much): import std.typecons: TypeTuple; // this needs to be template of std.typecons template ReverseTypeTuple(T...) { // too much long name static if (T.length) alias TypeTuple!(ReverseTypeTuple!(T[1 .. $]), T[0]) ReverseTypeTuple; else alias T ReverseTypeTuple; } auto ref reverseArgs(alias fun, Args...)(auto ref Args args) { return fun(ReverseTypeTuple!args); } int div(int a, int b) { return a / b; } void main() { assert(reverseArgs!div(3, 27) == 9); } Bye, bearophile