Philippe Sigaud wrote: > On Fri, Aug 6, 2010 at 11:43, Rory Mcguire <rjmcgu...@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); }