On Saturday, 7 April 2018 at 19:21:30 UTC, Simen Kjærås wrote:
import std.meta;
import std.traits;
// List all member functions, and wrap them such that
myFoo.fun(3) can be called as
AllMemberFunctions!(typeof(myFoo))[idx](myFoo, 3).
template AllMemberFunctions(T)
{
template createDg(alias fn)
{
static if (__traits(isStaticFunction, fn))
alias createDg = fn;
else
ReturnType!fn createDg(ref T ctx, Parameters!fn
args)
{
ReturnType!fn delegate(Parameters!fn) fun;
fun.funcptr = &fn;
fun.ptr = cast(void*)&ctx;
return fun(args);
}
}
alias GetOverloads(string name) =
AliasSeq!(__traits(getOverloads, T, name));
alias AllMemberFunctions = staticMap!(createDg,
staticMap!(GetOverloads, __traits(allMembers, T)));
}
--
Simen
Many thanks for this!!! Was really helpful.
I ended up unfolding the struct members into an array of member
strings and mapping those to either the struct tuple members or
the struct function members.
This way I can call all members (normal and bitfield members) in
order.
Result:
https://gist.github.com/Timoses/c78e599e91b8d05be34aefaf75ca3739
This project is really teaching me some template actions : D.