On 03/05/12 21:16, H. S. Teoh wrote:
> I know D doesn't really have RTTI yet, but I'm experimenting with
> "faking" it by doing something like:
> 
>       class A {
>               string prop1;
>               int prop2;
>               ...
>               void serialize() {
>                       __serialize(this);
>               }
>       }
> 
>       void __serialize(T)(T obj) {
>               writeln(typeid(obj));
>               foreach (name; __traits(derivedMembers, T)) {
>                       writefln("%s = %s", name,
>                               __traits(getMember,obj,name));
>               }
>       }
> 
> The only thing is, serialize() has to be declared in every derived
> class, because T needs to be known at compile-time. Is there a way to
> "automate" this? I.e., automatically insert the serialize() boilerplate
> code into derived classes?

Well, what exactly are you trying to do? IOW why "derivedMembers" - do you
really need to skip serializing parts of the class hierarchy?

If not, this should work.
 
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.

Real programmers don't use mixins, :^)

artur

Reply via email to