模板约束中的ElementType

时间:2012-05-23 18:52:56

标签: templates d

如何在模板约束中使用std.range.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]));

1 个答案:

答案 0 :(得分:3)

表达式与运算符不同。关于is表达式的文档在这里: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是一个模板,而不是一个函数。