8 ms·
import std.meta: AliasSeq; enum E { a, b, c } void handle(E e) { // Need label to break out of 'static foreach' Lswitch: final switch (e)
by Snarwin 1y ago
import 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; } }