Шаблоны (Templates) = Generic

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение zub » 09.01.2007 15:01:59

Я наверно чето не понимаю, но чем предпологаемая тобой генерация компилятором функции тип_compareto для каждого типа, отличается от генерации сразу min для каждого типа? и как он будет выдирать "тип_compareto" из "мин" в случае если нам надо сделать чтото более сложное чем min\max
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Сообщение shade » 09.01.2007 15:38:24

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) - а их размер (в байтах) фиксирован для каждого конкретного шаблона и может быть значительно меньше, чем размер генерируемой функции/класса.
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Mirage » 09.01.2007 21:44:18

Ну функцию Min() можно и без генериков сделать.:)
Кстати, вложений форум не держит?
Вот quicksort на инклудах с примерами использования.
Использовать вполне удобно. Может кому пригодится...

А мне генерики единственно могут пригодиться для реализации классов-контейнеров. Вот их на иклудах делать неудобно.

А если начнут как в С++ пихать где надо и где не надо, то это грустно. А ведь начнут. Принцип "есть фича - нада юзать" в действии. Юзабельных библиотек поуменьшится...
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru