Issue with traits usability
Simen Kjærås
simen.kjaras at gmail.com
Thu Mar 22 10:24:52 UTC 2018
On Wednesday, 21 March 2018 at 15:36:01 UTC, Márcio Martins wrote:
> Hi!
>
> How do I get past this?
>
>
> static struct X {
> int x;
> private enum T = 1;
> private alias M = string;
> }
>
> foreach (Member; __traits(allMembers, X)) {
> pragma(msg, __traits(getProtection, __traits(getMember, X,
> Member)));
> }
>
>
> Output:
>
> public
> private
> c.d(1084): Error: argument string has no protection
> c.d(1084): while evaluating pragma(msg,
> __traits(getProtection, string))
>
>
> What I want to achieve essentially is skip all X's aliases and
> templates, but get everything else, like enums and data
> members. How would I go about this in a robust way?
> I actually want to skip aliases, and templates.
__traits(compiles) is your friend:
unittest {
static struct X {
int x;
private enum T = 1;
private alias M = string;
}
foreach (Member; __traits(allMembers, X)) {
static if (__traits(compiles, __traits(getProtection,
__traits(getMember, X, Member)))) {
pragma(msg, __traits(getProtection,
__traits(getMember, X, Member)));
}
}
}
--
Simen
More information about the Digitalmars-d-learn
mailing list