https://issues.dlang.org/show_bug.cgi?id=13372
--- Comment #3 from b2.t...@gmx.com --- Strangely enough this bug can lead to think that we can detect an eponymous template: ========== template isTemplateInstance(alias T : Base!Args, alias Base, Args...) { enum isTemplateInstance = is(typeof(T)); } template isTemplateInstance(T : Base!Args, alias Base, Args...) { enum isTemplateInstance = is(T); } template isTemplateInstance(T) { enum isTemplateInstance = false; } template isTemplateInstance(alias T) { enum isTemplateInstance = isTemplateInstance!(typeof(T)); } template isEponymousTemplate(T) { static if (is(T == class) || is(T == interface) || is(T == struct) || is(T == union)) { enum p = __traits(parent, T).stringof == T.stringof; enum isEponymousTemplate = p && isTemplateInstance!T; } else enum isEponymousTemplate = false; } unittest { class A(T){} struct B(T){} static assert(isEponymousTemplate!(A!int)); static assert(isEponymousTemplate!(B!int)); static assert(!isEponymousTemplate!int); template C(T) { class C{} } static assert(isEponymousTemplate!(C!int)); } unittest { template A(T) { class A{} } static assert(isEponymousTemplate!(A!int)); template B(T) { class A{} } static assert(!isEponymousTemplate!(B!int.A)); class C(T){} static assert(!isEponymousTemplate!int); A!int a; static assert(isEponymousTemplate!a); } ========== Indeed we can detect it but we can't get the parent ! What's happen is that "isEponymousTemplate" yield true for an eponymous template because the template itself points to its argument ! --