Это проходит все, кроме 2 тестов, которые я перечислил в другой ответ
import std.algorithm : startsWith, canFind;
template isTemplate(alias B) {
enum isTemplate = !__traits(compiles, {auto x=B;}) // excludes values
&& !__traits(compiles, {B x;}) // excludes types
&& __traits(compiles, {alias B x;}) // excludes instance members
&& !B.stringof.startsWith("module ", "package ") // excludes modules
&& !B.stringof.canFind("!("); // excludes instantiated templates
}
2 теста, которые не прошли, как:
struct Inner2(string U="!(") {}
static assert(isTemplate(Inner2));
Если выуверены, что шаблон не будет иметь аргумента по умолчанию, содержащего "...!(..."
Я думаю, что он безопасен для использования.