To dig into an aggregate, the first step is to get a list of members. Then, we'll be able to look at each individual member and dig as deeply as we need to.
Let's execute the following steps to get a list of all methods or fields in a module or object:
Get a reference to the aggregate. For a
struct
,class
, orenum
type, you may use its name directly (or if it is passed to a template, the corresponding template parameter). To get a reference to a module, usemixin("yourmodule.name")
.Get a list of the names of all members with
__traits(allMembers)
.Retrieve the member with
__traits(getMember)
. Use a helper template in the form ofalias helper(alias T) = T;
and analias
member in the loop to make referring to the member easier.Using static
if
and theis
expression, filter out any types:static if(is(member)) { /* type */ }
.Then, check for functions with the
is
expression ontypeof(member)
:else static if(is(typeof(member...