1

テンプレートは、いくつかの機能をクラスに追加するのに最適ですが、コンストラクターには問題があります。テンプレート 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 を呼び出すことは可能ですか? そうでない場合、クラスにデフォルトのコンストラクターがあることをテストする特性はありますか?

4

2 に答える 2

3

superコンストラクターの引数を転送して、一連の呼び出しを作成できます。

cImplementSomeStuffs

this(A ...)(A args) // formerly this()
{
    super(args);
    // etc ...

cSourceWithSomeStuffs2

this(int a) // could be this(A ...)(args), too
{
    super(a);
    // etc ...
于 2013-08-13T12:46:13.567 に答える
0

クラスが this のように継承されるclass C : Base {}か、 this のようにテンプレート化されると、他の方法で行われなければclass C (Base) : Base {}、デフォルトのコンストラクターがクラスで呼び出されます。Base

他のデフォルト コンストラクターを呼び出すには、次のような派生コンストラクターにスーパーコールを含めます。

class C : Base { super(myArguemnts); your code }

class C (Base) : Base { super(myArguemnts); your code }Base の型がわからないので、これはより複雑になる可能性があります。

必要に応じて、このような任意の拡張を転送できます

this (Args...) (int a, int b, Args args) { super (args); }Args には、任意の数の引数を渡すことができます。

于 2013-08-13T12:52:53.637 に答える