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