2015-10-09 10 views
6

Я пытаюсь найти надежный способ определения, является ли данный символ шаблоном функции. Следующее:Определение того, является ли символ функцией шаблона

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 разборе.

+0

stringof может быть лучшим, что вы собираетесь получить, так как для дальнейшего тестирования вам нужно создать экземпляр шаблона, и нет никакого гарантированного способа сделать это. (Подумайте об одном с ограничением 'if (false)', было бы невозможно войти в него). –

ответ

0

Кажется, что нет лучшего способа сделать это в D, как сейчас, поэтому я буду придерживаться разбора .stringof, как грязный хак, как есть.