RAII

直ぐに使い終わる一時オブジェクトをスタックに確保したい。
というのはよくあるんですけどD言語では簡単には出来ません。


なぜなら、new演算子がクラスのメンバとしてしか定義出来ないからです。
まぁ、それでも自前のクラスならnew演算子を定義してスタックに確保できます。
しかし、既存のクラスを書き換えたいときに困ります。


10分ほど悩んで自分の出した結論

auto class StackObject(T,A1=void,A2=void) : T{
	     static if(is(A1==void))
		this(){}
	else static if(is(A2==void))
		this(A1 a1){super(a1);}
	else
		this(A1 a1,A2 a2){super(a1,a2);}
	
	new(size_t sz,void*ptr){return ptr;}
	delete(void*ptr){}
}
template stackNew_(T){
	template ctor(){T ctor(void*ptr)
	{return new(ptr) StackObject!(T);}}
	template ctor(A1){T ctor(void*ptr,A1 a1)
	{return new(ptr) StackObject!(T,A1)(a1);}}
	template ctor(A1,A2){T ctor(void*ptr,A1 a1,A2 a2)
	{return new(ptr) StackObject!(T,A1,A2)(a1,a2);}}
}
template stackNew(T){
	alias stackNew_!(T).ctor stackNew;
}
private import std.c.stdlib,std.stream;
void main(charargs){
	auto File x = stackNew!(File)
		(alloca(File.classinfo.init.length),args[1]);
	foreach(char[]line;x)printf("%.*s\n",line);
}

どう考えても継承の正しい使い方とは思えない醜いコードです。
もうちょいスマートに書ける方法はないんかなー?