zub писал(а):Я наверно чето не понимаю, но чем предпологаемая тобой генерация компилятором функции тип_compareto для каждого типа, отличается от генерации сразу min для каждого типа? и как он будет выдирать "тип_compareto" из "мин" в случае если нам надо сделать чтото более сложное чем min\max
Просто выбор тип_compareto был не очень удачным. т.к. у Integer нет метода Integer.CompareTo...
Возьмем вместо тип_compareto оператор <
Перепишем функцию min в таком виде:
- Код: Выделить всё
template <class TSomeType>
function min(A, B: TSomeType): TSomeType;
begin
if A < B then Result := A
else Result := B;
end;
Оператор
operator < (A, B: Тип): Boolean; уже есть для Integer, Float string и др. простых типов, единственное, что для этих типов он как бы inline и в данном случае конечно прийдеться его описать в виде функции
- Код: Выделить всё
function fpc_integer_gt(var A, B: Integer): Boolean; compilerproc;
компилятору его не нужно создавать, подобная функция должна быть частью RTL.
Для классов же программист либо
определяетх соответствующий оператор/функцию и
может использовать свой класс в шаблонной функции, либо
не определяет и
не может использовать в шаблонной функции, а компилятор никаких дополнительных функций не производит!.
Единственное, что компилятор должен производить так это "шаблонный интерфейс", т.е. таблицу виртуальных методов. В приведенном примере
generic1.rar генериуются не функции тип_CompareTo, а таблицы виртуальных методов шаблон_типVMT (min_IntegerVMT, min_AnsiStringVMT) - а их размер (в байтах) фиксирован для каждого конкретного шаблона и может быть значительно меньше, чем размер генерируемой функции/класса.