D RTTI?

Timon Gehr timon.gehr at gmx.ch
Mon Mar 5 15:03:48 PST 2012


On 03/05/2012 11:33 PM, H. S. Teoh wrote:
> 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
>

You can check typeof(this).





More information about the Digitalmars-d-learn mailing list