テンプレートは、いくつかの機能をクラスに追加するのに最適ですが、コンストラクターには問題があります。テンプレート ctor とクラス (パラメーターとして渡される) ctor がデフォルトのフォームを持っている場合にのみ機能します。( DPasteテスター)
module main;
class cInternalMandatoryClass{};
class cImplementSomeStuffs(T): T
if((is(T==class)/* & (HaveADefaultCtor!T) */))
{
private:
cInternalMandatoryClass fObj;
public:
void Something1(){}
this(){fObj = new cInternalMandatoryClass;}
~this(){delete fObj;}
}
class cSource1
{
int fA;
this(){fA = 8;}
}
class cSource2
{
int fA;
this(){}
this(int a){fA = a;}
}
class cSourceWithSomeStuffs1: cImplementSomeStuffs!cSource1
{
this()
{
assert(fObj !is null); // check cImplementSomeStuffs ctor
assert(fA == 8); // check cSource1 ctor
}
}
class cSourceWithSomeStuffs2: cImplementSomeStuffs!cSource2
{
this(int a)
{
// need to call cSource2 ctor
assert(fObj !is null); // check cImplementSomeStuffs ctor
assert(fA == 9); // check cSource2 ctor, fails
}
}
void main(string[] args)
{
auto Foo = new cSourceWithSomeStuffs1();
delete Foo;
auto Bar = new cSourceWithSomeStuffs2(9);
delete Bar;
}
cSourceWithSomeStuffs2 で cSource2 ctor を呼び出すことは可能ですか? そうでない場合、クラスにデフォルトのコンストラクターがあることをテストする特性はありますか?