D编程中的模板

Nat*_*ate 10 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));
}
Run Code Online (Sandbox Code Playgroud)

Cor*_*rch 13

从...开始:

auto foo(T)(T n) if (isNumeric!T) {
     // ignore this for now
}
Run Code Online (Sandbox Code Playgroud)

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

这个:

(T m) {return m > n;}; //returned from foo
Run Code Online (Sandbox Code Playgroud)

是一个委托文字(或闭包).它基本上是一个带状态的函数指针.在这种情况下,它会关闭n传递给foo 的参数.在你的例子中:

auto hoo5 = foo!int(1000);
Run Code Online (Sandbox Code Playgroud)

有效地转化为功能:

bool hoo5 (int x) { return x > 1000; }
Run Code Online (Sandbox Code Playgroud)

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

如果你像这样打电话给foo:

auto hoo5 = foo!double(1.2345);
Run Code Online (Sandbox Code Playgroud)

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