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.

Reply via email to