D RTTI?

H. S. Teoh hsteoh at quickfur.ath.cx
Tue Mar 6 15:19:32 PST 2012


On Tue, Mar 06, 2012 at 11:40:19PM +0100, Artur Skawina wrote:
> On 03/06/12 20:37, 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.
> 
> Of course. But is it really necessary to fully serialize derived classes
> *w/o* knowing what they are? In that case deserialization will probably be
> "interesting" too...

It's easy. We already output the class name in the serialization, so to
deserialize, we just call Object.factory(class_name), then a per-class
deserialize() method similar to the above that reconstructs class data.


> > 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. :-(
> 
> If you can "register" the classes to be serialized then typeid() can
> help the __serialize() implementation...

True. But TypeInfo doesn't let you access actual data members without
using void* casts and pointer arithmetic, whereas compile-time
introspection does.


[...]
> Seriously though, many (most?) uses of mixins are caused by language
> deficiencies; sometimes the mixins are necessary, but often a cleaner
> solution would have been possible, with a little more help from the
> compiler.
[...]

True, mixins should only be used as a last resort. :-) If something
can be implemented without mixins, then mixins shouldn't be used.


T

-- 
The best way to destroy a cause is to defend it poorly.


More information about the Digitalmars-d-learn mailing list