import std.stdio, std.meta, std.traits;
template TypesOf(Values...) {
import std.meta: AliasSeq;
import std.traits: isFunction;
static if (Values.length)
static if (isFunction!(Values[0]))
alias T = typeof(&Values[0]);
else static if (is(typeof(Values[0])))
alias T = typeof(Values[0]);
alias TypesOf = AliasSeq!(T, TypesOf!(Values[1..$]));
alias TypesOf = AliasSeq!();
void f0() { writeln("f0"); }
void f1() { writeln("f1"); }
struct S { void f2() { writeln("f2"); } }
alias TT = TypesOf!(f0, f1, s.f2);
alias A = TT[0]; pragma(msg, A);
alias B = TT[1]; pragma(msg, B);
alias C = TT[2]; pragma(msg, C);