On Tue, Mar 06, 2012 at 12:03:48AM +0100, Timon Gehr wrote:
> On 03/05/2012 11:33 PM, H. S. Teoh wrote:
[...]
> >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?
[...]
> 
> You can check typeof(this).

Ahh, that's what I was looking for.

Awesome!!! By combining typeof(this) with __traits(hasMember,...), I can
actually insert missing methods into a class if they haven't been
defined yet, or override existing methods if they are already defined in
the base class:

        template Serializable() {
                enum Serializable = q{
                        static if (__traits(hasMember, typeof(this),
                                        "serializable"))
                        {
                                // Override existing method
                                override void serialize(...);
                        }
                        else
                        {
                                // Insert missing method
                                void serialize(...);
                        }
                };
        }

        class A {
                // This causes A to acquire serialize()
                mixin(Serializable!());
        }

        class B : A {
                // This causes B to override serialize()
                mixin(Serializable!());
        }


D is too cool for words.


T

-- 
For every argument for something, there is always an equal and opposite 
argument against it. Debates don't give answers, only wounded or inflated egos.

Reply via email to