Я пытаюсь найти надежный способ определения, является ли данный символ шаблоном функции. Следующее:Определение того, является ли символ функцией шаблона
import std.traits: isSomeFunction;
auto ref identity(T)(auto ref T t) { return t; }
static assert(isSomeFunction!identity);
потерпит неудачу, как identity
еще шаблон, пока не конкретизируется. В настоящее время я использую хак, который опирается на тот факт, что <template function symbol>.stringof
отформатирована определенным образом:
//ex: f.stringof == identity(T)(auto ref T t)
template isTemplateFunction(alias f)
{
import std.algorithm: balancedParens, among;
enum isTemplateFunction = __traits(isTemplate, f)
&& f.stringof.balancedParens('(', ')')
&& f.stringof.count('(') == 2
&& f.stringof.count(')') == 2;
}
//Passes
static assert(isTemplateFunction!identity);
я хотел бы знать, если есть лучший способ сделать это, кроме Hacky stringof
разборе.
stringof может быть лучшим, что вы собираетесь получить, так как для дальнейшего тестирования вам нужно создать экземпляр шаблона, и нет никакого гарантированного способа сделать это. (Подумайте об одном с ограничением 'if (false)', было бы невозможно войти в него). –