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).



Reply via email to