有人可以解释下面的代码吗?当我试图理解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.