1

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]));
4

1 回答 1

3

is表达式与is运算符不同。关于 is 表达式的文档在这里:http ://dlang.org/expression.html#IsExpression 。is运算符对值进行按位比较,而is表达式比较类型(并进行疯狂的模式匹配)。你的约束应该这样写:

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

或者,如果您还想匹配任何可隐式转换为 uint 的内容:

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

此外,我已经修复了您对 ElementType 的调用,添加了“!” 在适当情况下; ElementType 是一个模板,而不是一个函数。

于 2012-05-23T19:38:45.777 回答