D RTTI?

H. S. Teoh hsteoh at quickfur.ath.cx
Tue Mar 6 11:37:10 PST 2012


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.


More information about the Digitalmars-d-learn mailing list