D编程中的模板

时间:2010-12-03 18:51:00

标签: d

有人可以解释下面的代码吗?当我试图理解isNumeric时,我感到很困惑!在这种情况下,T会起作用。

auto foo(T)(T n) if (isNumeric!T) {
     return (T m) {return m > n;};
}

void main() {
    auto hoo5 = foo!int(1000);
    writeln(hoo5(93));
    writeln(hoo5(23));
}

1 个答案:

答案 0 :(得分:13)

开始于:

auto foo(T)(T n) if (isNumeric!T) {
     // ignore this for now
}

foo是一个泛型函数,它接受一个泛型类型的参数。 if (isNumeric!T)是来自std.traits的编译时检查,它保证foo的类型是数字。非数字类型不起作用。推断它的返回类型,在这种情况下是委托。

此:

(T m) {return m > n;}; //returned from foo

delegate literalor closure)。它基本上是一个带状态的函数指针。在这种情况下,它会关闭传递给foo的参数n。在您的示例中:

auto hoo5 = foo!int(1000);

有效地转换为函数:

bool hoo5 (int x) { return x > 1000; }

因此,当您调用hoo5时,它会返回一个布尔值,指示其参数是否大于1000 - 但仅限于您的特定情况。

如果你这样打电话给foo:

auto hoo5 = foo!double(1.2345);

您获得对函数的引用,该函数返回一个布尔值,指示其参数(双精度)是否大于1.2345。