可変長テンプレート関数

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);
}