2015-10-09 21 views
6

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.

+0

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). –

risposta

0

Sembra che non ci sia un modo migliore per farlo in D come lo è ora, quindi mi limiterò ad analizzare parsing .stringof, come sporco un hack così com'è.

Problemi correlati