2015-10-09 5 views
6

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.

+0

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

Antwort

0

Es scheint, es gibt keinen besseren Weg, dies in D zu tun, wie es jetzt ist, also bleibe ich beim Parsen von .stringof, so schmutzig wie ein Hack.

Verwandte Themen