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); }
どう考えても継承の正しい使い方とは思えない醜いコードです。
もうちょいスマートに書ける方法はないんかなー?