Шаблон в программировании 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

Начните с:

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.