https://issues.dlang.org/show_bug.cgi?id=17713

er.kr...@gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |er.kr...@gmail.com

--- Comment #1 from er.kr...@gmail.com ---
I would add that they should really work pretty much everywhere in a class...
i.e. all kind of templates:

---

template isClass(T) {
    static if (is(T == class)) {
        enum isClass = true;
    } else {
        enum isClass = false;
    }
}

template Super(C) if (isClass!C) {
    import std.traits;
    import std.meta;

    static if (is(C == Object)) {
        alias Super = AliasSeq!();
    } else {
        alias Parents = Filter!(isClass, BaseTypeTuple!C);
        static assert (Parents.length == 1);
        alias Super = Parents[0];
    }
}


class A {
public:
    enum desc = "class A";
    template getDesc(this C) if (is(C == A)) {
        enum getDesc = A.desc;
    }
    template getDesc(this C) if (!is(C == A)) {
        enum getDesc = (Super!C).getDesc ~ " - " ~ C.desc;
    }
}

class B : A {
    enum desc = "class B";
}

class C : B {
    enum desc = "class C";
}

void main() {
    static assert(C.getDesc == "class A - class B - class C");
}

--

Reply via email to