Начните с:
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
является литералом делегата (или закрытие). По сути, это указатель на функцию с состоянием. В этом случае он закрывается по параметру n
, переданному в foo. В вашем примере:
auto hoo5 = foo!int(1000);
эффективно переводится в функцию:
bool hoo5 (int x) { return x > 1000; }
Поэтому, когда вы вызываете hoo5
, он возвращает логическое значение, указывающее, больше ли его аргумент 1000, но только в вашем конкретном случае.
Если вы вызываете foo следующим образом:
auto hoo5 = foo!double(1.2345);
Вы получаете ссылку на функцию, которая возвращает логическое значение, указывающее, больше ли ее аргумент (двойной) 1,2345.
person
Corbin March
schedule
03.12.2010