enums and version/static if/"inheritance"

Nick Treleaven nick at geany.org
Mon Jul 29 11:25:45 UTC 2024


On Sunday, 28 July 2024 at 22:20:47 UTC, Witold Baryluk wrote:
> Unfortunately this only works for top level enum values. It 
> does not work for named enum types.
>
> A simple example
>
> ```d
> enum FOO {
>   A = 5,
>   B = 6,
> version (x86_64) {
>   C = 7,
> } else version (AArch64) {
>   C = 17,
> } else {
>   static assert(0);
> }
>   version E = 9,
> }
> ```

Possible workaround if each enum member is given a specific 
initializer:
```d
struct FooEnum
{
     int A = 5, B = 6;
     version (x86_64) {
         int C = 7;
     } else version (AArch64) {
         int C = 17;
     } else {
         static assert(0);
     }
}

mixin enumGen!(FooEnum, "FOO");

static assert(FOO.A == 5);
static assert(FOO.B == 6);

version (x86_64)
static assert(FOO.C == 7);

template enumGen(T, string name)
{
     private string _gen()
     {
         T v;
         auto r = "enum " ~ name ~ " {";
         foreach (m; __traits(allMembers, T))
         {
             import std.conv;
             r ~= m ~ "=" ~ __traits(getMember, v, m).to!string ~ 
",";
         }
         r ~= "}";
         return r;
     }
     mixin(_gen);
}
```


More information about the Digitalmars-d mailing list