loop over all parameters of all overloads of all members
TheFlyingFiddle
theflyingfiddle at gmail.com
Sun Feb 23 15:11:35 PST 2014
On Sunday, 23 February 2014 at 21:08:48 UTC, Frustrated wrote:
> The following code craps out on the inner for each
>
> foreach (am; __traits(derivedMembers, B))
> foreach (m; [__traits(getOverloads, B, am)])
> {
>
> }
>
> So how can I loop over all the parameters of all the overloads
> of
> all the members of a class?
>
> Create some weird mapping tuple?
Here's an example of how to loop over all paremters of all the
methods in a class T and print the functions with arguments.
import std.typetuple, std.traits;
class B
{
void b() { }
void b(int i) { }
void b(int i, long l) { }
}
string signatureString(alias func)()
{
alias pt = ParameterTypeTuple!func;
alias pi = ParameterIdentifierTuple!func;
alias rt = ReturnType!func;
enum name = __traits(identifier, func);
enum stat = __traits(isStaticFunction, func) ? "static " : "";
string s = stat ~ rt.stringof ~ " " ~ name ~ "(";
foreach(i, dummy; pt) {
s ~= pt[i].stringof ~ " " ~ pi[i];
static if(i != pt.length - 1)
s ~= ",";
}
s ~= ")";
return s;
}
void ctPrintClassFunctions(T)()
{
foreach(member; __traits(allMembers, T))
{
static if(__traits(compiles, __traits(getOverloads,
T.init, member)))
{
alias Overloads = TypeTuple!(__traits(getOverloads,
T.init, member));
foreach(overload; Overloads)
{
pragma(msg, signatureString!overload);
}
}
}
}
void main()
{
ctPrintClassFunctions!B;
}
> I guess we are not going to get a static foreach any time soon?
Every foreach in the example is a "static" foreach in the sense
that it unrolls the loops and evaluates them at compiletime.
More information about the Digitalmars-d-learn
mailing list