Ответ 1
Начните с:
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);
Вы получаете ссылку на функцию, которая возвращает логическое значение, указывающее, если его аргумент (double) больше 1.2345.