this does not work: ``` module self; import self; enum getMember = `__traits(getMember, sym, m)`; template printMembers(alias sym) { static foreach (m; __traits(allMembers, sym)) { pragma(msg, __traits(identifier, mixin(getMember))); static if (is(mixin(getMember)==module) || // HERE is(mixin(getMember)==class) || // HERE is(mixin(getMember)==struct)) // HERE { alias _ = printMembers!(mixin(getMember), m); // ERROR HERE } } } void main() { alias _ = printMembers!(mixin(__MODULE__)); } ``` but this does ``` module self; import self; enum getMember = `__traits(getMember, sym, m)`; template printMembers(alias sym) { static foreach (m; __traits(allMembers, sym)) { pragma(msg, __traits(identifier, mixin(getMember))); static if (is(__traits(getMember, sym, m)==module) || // HERE is(__traits(getMember, sym, m)==class) || // HERE is(__traits(getMember, sym, m)==struct)) // HERE { alias _ = printMembers!(mixin(getMember), m); // NO CHANGE HERE BUT WORKS } } } void main() { alias _ = printMembers!(mixin(__MODULE__)); } ```
actually compilation fails/succeeds only depending on is(mixin(getMember)==module VS is(__traits(getMember, sym, m)==module
also the version that compiles should not alias _ = printMembers!(mixin(getMember), m); but printMembers takes only one template type parameter