D RTTI?

H. S. Teoh hsteoh at quickfur.ath.cx
Mon Mar 5 14:33:38 PST 2012


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!


More information about the Digitalmars-d-learn mailing list