模板很适合向类中添加一些功能,但构造函数存在问题:它仅在模板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? 如果没有,是否有一个特性来测试一个类是否有默认构造函数?
答案 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传递任意数量的参数。