Еще о Generic-ах (FPC) | |
Начало - см. здесь | |
При более детальном рассмотрении этого нововведения в FPC оказывается, что:
-- generic type generic identifier < template list > = generic class ;
, то вполне естественно будет попробовать, например, реализовать ассоциативный массив (аналог - контейнер std::map).
type generic TMap<TK, TV> = object ... end;Как видим, и такая конструкция вполне работоспособна...
type generic TRec<T> = record i: integer; end;успешно проходит компиляцию, однако при попытке сделать то, ради чего и нужны шаблоны (описать в записи поле типа T):
type generic TRec<T> = record i: T; end;, компилятор начинает ругаться, что ему непонятен тип T.
type generic TObjRec<T> = class type public TRec = record value: T; end; end; type intObj = specialize TObjRec<integer>; var my_rec: intObj.TRec; begin myRec.value := 20; writeln(myRec.value + 15); end.
type generic Func<T> = class type public procedure swap(var a, b: T); class procedure sort(var ar: array of T; n: integer); // <--- !!! end; function index(x: integer): integer; begin result := pred(x) end; procedure Func.swap(var a, b: T); var X: T; begin X := a; a := b; b := X end; class procedure Func.sort(var ar: array of T; n: integer); var i, j: integer; begin for i := 1 to n do for j := n downto i + 1 do if ar[index(pred(j))] > ar[index(j)] then swap(ar[index(pred(j))], ar[index(j)]); end;Почему понадобилось описывать sort, как class procedure? Очень просто: для того, чтобы использовать ее, не создавая экземпляра класса:
type intFunc = specialize Func<integer>; strFunc = specialize Func<string>; var i: integer; const n = 12; vec: array[1 .. 12] of integer = ( 7, 6, 15, 4, 3, 2, 1, 0, 12, 15, 98, 11 ); s_vec: array[1 .. 12] of string = ( '7', '6', '15', '4', '3', '2', '1', '0', '12', '15', '98', '11' ); begin for i := 1 to n do write(vec[i]:4); writeln; intFunc.sort(vec, n); for i := 1 to n do write(vec[i]:4); writeln; for i := 1 to n do write(s_vec[i]:4); writeln; strFunc.sort(s_vec, n); for i := 1 to n do write(s_vec[i]:4); writeln; end.Как видим, и массив целых, и массив строк прекрасно отсортировались...