可変長テンプレート関数
D言語の関数テンプレートはこういう書き方ができません
T[] array(T)(T []dgs...){ return dgs.dup; }
まぁ嫌だけど仕方がないかと思っていましたけど、
こういう誤魔化し方が通用するみたいです。
T[] array(T)(T a,T []dgs...){ return a ~ dgs; }
インチキ臭いにもほどがある書き方ですね。
一応前回のscase + cond(id:kurimura:20060822)は
書き直してこうも書けますね。
struct Pair(F,S){F first;S second;} Pair!(Pred,T delegate()) scase(Pred,T)(Pred b, T delegate()dg){ typeof(scase(b,dg)) r; r.first = b; r.second = dg; return r; } typeof(T.second()) cond(T) (T delegate() case1,T delegate()[]cases...) { // case1 ~ cases で何故かコンパイルエラーが出るので回避 foreach(c;(&case1)[0..1]~cases){ auto d = c(); if(d.first)return d.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"[]) // 最後にカンマが無いのが微妙に統一感が無くて嫌w ); printf("%.*s",x); }