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