类模板和构造函数

时间:2013-08-13 02:56:33

标签: templates constructor d

模板很适合向类中添加一些功能,但构造函数存在问题:它仅在模板ctor和类(作为参数传递)ctor具有默认形式时才有效。 (DPaste tester

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? 如果没有,是否有一个特性来测试一个类是否有默认构造函数?

2 个答案:

答案 0 :(得分: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 ...

答案 1 :(得分:0)

当类像class C : Base {}一样继承或者像class C (Base) : Base {}那样被模板化时,如果没有这样做,则在Base类上调用默认构造函数。

在派生构造函数中调用其他默认构造函数包含 super 调用,如:

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传递任意数量的参数。