On Tue, Mar 06, 2012 at 01:51:51AM +0100, Artur Skawina wrote: [...] > class A { > string prop1; > int prop2; > > void serialize(this THIS)() { > __serialize(cast(THIS*)&this); > } > } > > void __serialize(T)(T* obj) { > writef("%s {\n", typeid(*obj)); > foreach (name; __traits(allMembers, T)) { > static if (__traits(compiles,&__traits(getMember,obj,name))) { > alias typeof(__traits(getMember,obj,name)) MT; > static if (is(MT==function)) > continue; > else { > auto m = __traits(getMember,obj,name); > if (is(MT:const(char[]))) > writef(" %s %s = \"%s\";\n", typeid(MT), name, m); > else > writef(" %s %s = %s;\n", typeid(MT), name, m); > } > } > } > writef("}\n"); > } > > And it will do the right thing for derived classes too. [...]
Hmm, it only does the right thing for derived class if invoked with the derived class pointer. It doesn't work (and in retrospect can't possibly work, since "this THIS" is a compile-time parameter) if you only have the base class pointer. What I needed was for serialize() to be polymorphic at runtime, so it does have to be overloaded in every derived class. Hmph... looks like I can't avoid using mixins. :-( T -- Customer support: the art of getting your clients to pay for your own incompetence.