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