On Wednesday, 25 December 2024 at 18:25:57 UTC, sfp wrote:

kind of weird that it doesn't work inside `enum`.
Seems like an obvious application...

It's not weird at all when you understand that it's an AST that is being mixed in, not just a string as if it were an C preprocessor macro. The insides of `enum { ... }` is not an expression so it makes no sense to try to mix in an expression. enums are indeed an obvious application for mixins, but that's just not the way you do it. Here's are some mixins I wrote just yesterday:

```
string membersListMixin(alias T)() {
  string s;
  foreach (member; __traits(allMembers, T)) {
    s ~= member ~ ", ";
  }
  return s;
}

enum NamedEnum { // named so I can generate its fields
  field1 = "string1",
  field2 = "string2",
  // ...
}


void foo() {
  foreach (field; mixin(`[`, membersListMixin!NamedEnum, `]`)) {
    // do something with field
  }
}


string anonymousEnumMixin(alias E)() {
  string s = "enum { ";
  foreach (member; __traits(allMembers, E)) {
    s ~= member ~ " = " ~ E.stringof ~ "." ~ member ~ ", ";
  }
  return s ~ "}";
}

mixin(anonymousEnumMixin!NamedEnum);
// now I can refer to field1, field2, etc. without qualifying them.
```


Reply via email to