import std.typetuple;
// calculate compile-time tuple of functions declared in 'mod' module
template getFunctions(alias mod)
{
template filterPred(string name)
{
// if the 'name' is really a function, returns true
enum filterPred = is(typeof(__traits(getMember, mod, name)) == function);
}
alias names = Filter!(filterPred, __traits(allMembers, mod));
template mapPred(string name)
{
alias mapPred = TypeTuple!(__traits(getMember, mod, name))[0];
}
alias getFunctions = staticMap!(mapPred, names);
}
// gather functions from modname, then make function pointer table
auto makeTable(alias modname)()
{
mixin("import "~modname~";");
mixin("alias funcs = getFunctions!("~modname~");");
immutable(void*)[] make(size_t n)()
{
static if (n < funcs.length)
return cast(immutable(void*))&(funcs[n]) ~ make!(n+1)();
else
return [];
}
immutable(void*)[funcs.length] tbl = make!0()[0 .. funcs.length];
return tbl;
}
// make function pointer table
immutable func_table = makeTable!"decl"();
void main()
{
(cast(void function())func_table[0])();
assert((cast(int function(int))func_table[1])(10) == 20);
}