Ich versuche eine robuste Methode zu finden, um zu bestimmen, ob ein bestimmtes Symbol eine Funktionsvorlage ist. In der folgenden:Bestimmen, ob ein Symbol eine Template-Funktion ist
import std.traits: isSomeFunction;
auto ref identity(T)(auto ref T t) { return t; }
static assert(isSomeFunction!identity);
Wird als identity
scheitern ist immer noch eine Vorlage, bis es instanziiert wird. Derzeit bin ich einen Hack, der auf der Tatsache beruht, dass <template function symbol>.stringof
eine bestimmte Weise formatiert ist:
//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);
Ich mag gerne wissen, ob es ein besserer Weg, diese andere als Hacky stringof
Analyse zu tun.
stringof könnte das Beste sein, was Sie bekommen werden, um weitere Tests zu machen, müssten Sie die Vorlage instanziieren und es gibt keine garantierte Möglichkeit, dies tatsächlich zu tun. (Betrachte einen mit einer 'if (false) '- Einschränkung, es wäre unmöglich, jemals hinein zu kommen). –