さらに

某所でも紹介されていたscaseとcondもせっかくだから、値を返すように。
void f(T)(T[]...)は無理なので適当に~を使って回避。

struct Pair(F,S){
	F first;
	S second;
	Pair[]opCom(){return this[0..1];}
}
Pair!(F,S) make_pair(F,S)(F f,S s){
	Pair!(F,S)r;
	r.first=f;
	r.second=s;
	return r;
}
Pair!(Pred delegate(),T delegate())
scase(Pred,T)(Pred delegate()b, T delegate()dg){
	return make_pair(b,dg);
}
typeof(T.second()) cond(T)(T[]cases )
{
	foreach(c;cases)
		if(c.first())return c.second();
	return typeof(T.second()).init;
}

void main()
{
	int v = 2;
	auto x = cond(
		~scase(v == 1, "it is 1"[])
		~scase(v == 2, "it is 2"[])
		~scase(v == 3, "it is 3"[])
		~scase( true , "it is the default"[])
	);
	printf("%.*s",x);
}