Sto provando a trovare un metodo efficace per determinare se un determinato simbolo è un modello di funzione. Il seguente:Determinare se un simbolo è un modello Funzione
import std.traits: isSomeFunction;
auto ref identity(T)(auto ref T t) { return t; }
static assert(isSomeFunction!identity);
fallirà come identity
è ancora un modello fino a quando non viene creata un'istanza. Attualmente sto usando un hack che si basa sul fatto che <template function symbol>.stringof
formattato in un certo modo:
//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);
Mi piacerebbe sapere se c'è un modo migliore per fare questo diverso hacky stringof
parsing.
stringof potrebbe essere il migliore che si sta per ottenere dal momento di fare ulteriori test si dovrebbe istanziare il modello e non c'è un modo garantito per farlo davvero. (Considera uno con un vincolo 'if (false)', sarebbe impossibile entrarci dentro). –