On Mon, Mar 05, 2012 at 08:41:53PM +0000, Justin Whear wrote: > 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.
OK, it's a bit ugly I supopse, but I can live with that. Is there a way to tell whether or not a given class is a derived class or not? I'm using the Serializable template to insert serialize() into the class, and for derived classes I need to insert "override void serialize() ..." but for the base class I have to omit "override". How can I detect this in the template? Thanks! T -- No! I'm not in denial!