On Mon, 05 Mar 2012 12:16:14 -0800, 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?
> 
> (P.S.  D just took on brand new levels of cool when I realized I could
> do something like this. Imagine doing this with C++ templates...  ugh!
> What a painful thought!)
> 
> 
> T

The normal approach is to use a string mixin statement in each derived 
class:

template Serializable()
{
        enum Serializable = q{...your code here...};
}

class B : A
{
   mixin(Serializable);
}

Unfortunately, I don't believe there's any mechanism to order derived 
classes to automatically perform the mixin.

Reply via email to