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