さらに
某所でも紹介されていた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); }