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

d
person Nate    schedule 03.12.2010    source источник


Ответы (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);

Вы получаете ссылку на функцию, которая возвращает логическое значение, указывающее, больше ли ее аргумент (двойной) 1,2345.

person Corbin March    schedule 03.12.2010
comment
Есть опечатки. Я исправил это. Спасибо! - person Nate; 03.12.2010
comment
Вы очень хорошо объясняете. Я понимаю это сейчас. Спасибо. - person Nate; 03.12.2010