2019-07-17 22:16:11 +03:00
|
|
|
|
// Пример иллюстрирует использование знака "&" для явного указания шаблонного типа подпрограммы
|
|
|
|
|
|
|
|
|
|
|
|
function GetDefault<T>: T :=
|
2025-10-12 20:42:19 +03:00
|
|
|
|
default(T);
|
2019-07-17 22:16:11 +03:00
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
|
GenericType<T> = class
|
|
|
|
|
|
constructor := exit;
|
|
|
|
|
|
static procedure p1 := writeln(typeof(T));
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
2025-10-12 20:42:19 +03:00
|
|
|
|
// var o := GetDefault<byte>; //Ошибка: Встречено ';', а ожидалось выражение
|
2019-07-17 22:16:11 +03:00
|
|
|
|
// компилятор не отличает знак сравнения < от открытия угловой скобки
|
|
|
|
|
|
// и поэтому видит эту строчку как "(GetDefault < byte) > ;"
|
|
|
|
|
|
// ";" там оказывается неожиданно, потому что компилятор ожидал ещё какое то выражение для сравнения
|
|
|
|
|
|
|
|
|
|
|
|
// но, знаком "&" можно экранировать "<"
|
|
|
|
|
|
// то есть переключить значение "<" со знака сравнения на открывающуюся скобочку:
|
|
|
|
|
|
var o := GetDefault&<byte>;
|
|
|
|
|
|
|
|
|
|
|
|
// в случае с шаблонными типами - обычно "&" не нужен
|
|
|
|
|
|
var a := new GenericType<word>;
|
|
|
|
|
|
|
|
|
|
|
|
// однако для вызова статичного метода - его так же надо поставить
|
|
|
|
|
|
GenericType&<real>.p1;
|
|
|
|
|
|
|
|
|
|
|
|
end.
|