2015-10-09 19 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); 

我想知道是否有更好的方式比哈克stringof解析爲此等。

+0

stringof可能是最好的,因爲做進一步的測試你不得不實例化模板,並且沒有保證實際執行的方法。 (考慮一個帶有「if(false)」約束的問題,不可能永遠不能進入它)。 –

回答

0

看起來現在沒有更好的方式在D中這樣做了,所以我會堅持解析.stringof,就像骯髒的黑客一樣。

相關問題