inheriting ctors?
Rory Mcguire
rjmcguire at gm_no_ail.com
Fri Aug 6 11:35:44 PDT 2010
Philippe Sigaud wrote:
> On Fri, Aug 6, 2010 at 11:43, Rory Mcguire <rjmcguire at gm_no_ail.com>
> wrote:
>
>
>> I've been trying to make a template for this but it seems that dmd still
>> won't allow me to get the parameters of the constructors. dmd Seems to
>> think
>> that I'm trying to use it as a property.
>>
>>
>
>> void main() {
>> foreach (m; __traits(getOverloads, A, "__ctor")) {
>> pragma(msg, m.stringof); // it thinks I'm calling m
>> }
>> }
>>
>> constructors.d(34): Error: constructor constructors.A.this (int x) is not
>> callable using argument types ()
>>
>
> This is my new once-a-day bug :(
> Using a function alias, and being unable to call properties on it, because
> DMD thinks I'm calling it. Man, it's no property, just a name!
>
> Anyway, just pragma(msg, m) works, strangely.
> I think I found a way to use m, somewhat:
>
> void main() {
> foreach (m; __traits(getOverloads, A, "__ctor")) {
> pragma(msg, m); // it thinks I'm calling m
> typeof(&m) tmp = &m;
> writeln( (ParameterTypeTuple!tmp).stringof); // (int), (double),
> (string)
> writeln( (ParameterTypeTuple!m).stringof); // (int), (int), (int)
> writeln( typeof(&m).stringof); // A function(int x), A
> function(double x), A function(string s)
> }
> }
>
> using ParameterTypeTuple!m directly does not differentiate the m's. But
> using a temporary pointer, it seems to work.
>
> Oh and I even get the arguments names !
>
>
> Philippe
Thanks!! works now. Now we just need to be able to select which constructors
we actually want.
string inheritconstructors_helper(alias T)() {
string s;
foreach (m; __traits(getOverloads, T, "__ctor")) {
string args, args1;
foreach (i, cons; ParameterTypeTuple!(typeof(&m))) {
pragma(msg, cons.stringof);
args ~= ","~cons.stringof~" v"~to!string(i);
args1 ~= ",v"~to!string(i);
}
args = args.length < 1 ? args : args[1..$];
args1 = args1.length < 1 ? args1 : args1[1..$];
s ~= "this("~args~") { super("~args1~"); }\n";
}
return s;
}
class A {
int i;
//private this() {}
this(int x) {
i = x;
}
this(float x) {
i = cast(int)x; // ignore bad code
}
this(string s, int mul) { // test multiple args
i = to!int(s) * mul;
}
}
class B : A {
mixin(inheritconstructors_helper!A());
// InheritConstructors!A;
}
void main() {
A a = new B(4);
a = new B("42", 2);
}
More information about the Digitalmars-d-learn
mailing list