On 03/06/2012 08:37 PM, H. S. Teoh wrote:
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
Yes, I think this is quite a common need. Maybe some feature should be
added that allows the base class to automatically mixin stuff into all
derived classes.