D RTTI?

Timon Gehr timon.gehr at gmx.ch
Tue Mar 6 11:39:51 PST 2012


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.


More information about the Digitalmars-d-learn mailing list