2012-05-23 46 views
1

如何在模板約束中使用std.range.ElementType模板約束中的ElementType

我以爲這樣,可是我錯了

import std.range; 
auto f(T)(T x) 
    if (ElementType!(T) is uint) // adding this line causes lot of error messages 
           // first of which is: found ')' when expecting '.' following uint 
{ 
    return x; 
} 
f(map!"a"([1,2,3,4])); 
+0

它只發生在我認爲CTFE。 – Mehrdad

回答

3

表達是不一樣的操作。關於表達式的文檔在這裏:http://dlang.org/expression.html#IsExpression運算符執行值的按位比較,而表達式比較類型(並進行瘋狂的模式匹配)。您的約束應該這樣寫:

auto f(T)(T x) 
    if (is(ElementType!(T) == uint)) 

或者,如果你想匹配任何隱式轉換爲uint還有:

auto f(T)(T x) 
    if (is(ElementType!(T) : uint)) 

而且,我定你的ElementType的調用,加「!」在適當情況下; ElementType是一個模板,而不是一個函數。