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