3 ms·
I was trying to implement this trick in D using basic enum, but couldn't find a solution that works at compile-time, like in Zig. Could you show how to do that?
by brabel 1y ago
I was trying to implement this trick in D using basic enum, but couldn't find a solution that works at compile-time, like in Zig. Could you show how to do that?
- Snarwin 1y agoimport std.meta: AliasSeq; enum E { a, b, c } void handle(E e) { // Need label to break out of 'static foreach' Lswitch: final switch (e) { static foreach (ab; AliasSeq!(E.a, E.b)) { case ab: handleAB(); // No comptime switch in D static if (ab == E.a) handleA(); else static if (ab == E.b) handleB(); else static assert(false, "unreachable"); break Lswitch; } case E.c: handleC(); break; } }
- deleted 1y ago[deleted]
- brabel 1y agoThanks! That indeed does the equivalent as the Zig code... but feels a bit pointless to do that in D, I think? Could've done this and be as safe, but perhaps it loses the point of the article: enum U { A, B, C } void handle(U e) { with (U) final switch (e) { case A, B: handleAB(); if (e == A) handleA(); else handleB(); break; case C: handleC(); break; } }