On Tuesday, 27 October 2015 at 00:07:36 UTC, Ali Çehreli wrote:
I don't understand all uses of the request but typeid() returns a TypeInfo reference, which is about the actual type of an object. The following change produces the expected output in this case (except, it has the added module name):

void bar() { writeln(typeid(this).name); }

The output:

A
deneme.A
B
deneme.B
A
deneme.B

Ali

Here is another example

void main()
{
        A a = new A();
        a.foo(); // prints nothing
        a.bar(); // prints nothing

        B b = new B();
        a.foo(); // prints X
        b.bar(); // prints X

        A c = new B();
        a.foo(); // prints nothing
        c.bar(); // prints X, <--- main advantage
}

enum uda;

class A
{

        void foo(this T)()
        {
                import std.traits : hasUDA;

                auto t = cast(T) this;
                foreach(s; __traits(allMembers, T))
                {
                        static if(hasUDA!(mixin("t." ~ s),  uda))
                        {
                                writeln(s);
                        }
                }
        }

        void bar(auto override this T)()
        {
                auto t = cast(T) this;
                t.foo();
        }
}

class B : A
{
        @uda int x;
}

Reply via email to