static if, static foreach, version and debug

27.1 static if

static if doesn't introduce a new scope, so declarations inside are visible outside.

void describe(T)(T x)
{
    static if (is(T : long)) writeln("integral");
    else static if (is(T : real)) writeln("floating");
    else static if (isSomeString!T) writeln("string");
    else static assert(0, "unsupported type " ~ T.stringof);
}

27.2 static foreach

static foreach (i; 0 .. 3)
{
    mixin("int field" ~ i.stringof ~ ";");    // generates field0, field1, field2
}

enum names = ["red", "green", "blue"];
static foreach (n; names)
{
    mixin("void " ~ n ~ "() { writeln(\"" ~ n ~ "\"); }");
}

27.3 Conditional Compilation: version and debug

version (Windows) { enum pathSep = '\\'; }
else version (Posix) { enum pathSep = '/'; }
else static assert(0, "unsupported OS");

version (X86_64) {} version (AArch64) {} version (LDC) {} version (DigitalMars) {} version (GNU) {}
version (unittest) {} version (assert) {} version (D_BetterC) {} version (D_NoBoundsChecks) {}

version (EnableLogging) writeln("log");   // dmd -version=EnableLogging
debug writeln("only with -debug");
debug (verbose) writeln("dmd -debug=verbose");