Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Операция сравнения в дженериках


Друг ©   (2014-07-09 15:54:00) 

Пытаюсь сравнить между собой две переменные типа T
if (a < b) then ...

Ругается. Какого спрашивается фига?


jack128_   (2014-07-21 12:57:00) [1]


> Дженерики - НЕ шаблоны.

Ну да, эту матру все уже слышали не раз, а вот как объяснить чем же дельфийские дженерики лучше шаблонов - так никого.

Для NET'а все понятно, там дженерики можно в отдельных библиотеках распространять, но в дельфи то этого нельзя.

В результате мы имеет пересечение достоинств плюсов и нета, зато сумму их недостатков. Замечательно.


Очевидное   (2014-07-11 23:55:00) [2]

Дженерики - НЕ шаблоны.
И какая-то абстрактная "эффективность" тут совершенно не при чем.
Читайте же, наконец, хотя бы Википедию.
А то (ассемблер) смотреть научились, а понимать логику построения модулей и работы компилятора - нет.


jack128_   (2014-07-11 09:46:00) [3]


> посмотрел дизасм
> там происходит просто ужас!

Дельфи и эффективный обобщенный код ??
"Нет, сынок. Это фантастика." (с) старая реклама


Друг   (2014-07-10 10:28:00) [4]

> jack128_   (09.07.14 20:24) [10]
> if TComparer<T>.Default.Compare(a, b) < 0 then


посмотрел дизасм
там происходит просто ужас!

но всёравно спасибо
очень жаль в итоге


jack128_   (2014-07-09 20:27:00) [5]


> Блин, даже array[1..sizeof(T)] не работает
> Это просто ахтунг

Да, шаблоны плюсовые конечно удобнее. Вообще дельфийская реализация самая худшая и из известных мне, даже в джаве возможностей больше.


jack128_   (2014-07-09 20:24:00) [6]

if TComparer<T>.Default.Compare(a, b) < 0 then

но естественно это не работает например для рекордов с перекрытыми операторами сравнения. Да и вообще с рекордами.


Друг   (2014-07-09 17:39:00) [7]

В общем ладно
Я думал дженерики работают как сишные макросы
А оказалось "чего не знаю, того не компилю"
Мне кажется сишные шаблоны такую ситуёвину скомпилируют

Блин, даже array[1..sizeof(T)] не работает
Это просто ахтунг


Эрик Теодор   (2014-07-09 17:32:00) [8]


> Мне не хочется писать какие-то ограничения

а кто хочет? Вот у меня есть трусы - распрекрасного фасона и расцветки, но есть недостаток - их нельзя использовать как маечку. Пичалька


> Во-вторых, я пробовал TMyGeneric<T: ordinal> = class
> тоже ругается

а можть там "record" надо написать?


Друг   (2014-07-09 17:27:00) [9]

> Эрик Теодор   (09.07.14 16:57) [6]

Во-первых, там идёт контекст
Для того, чтобы наложить ограничение на обобщённый параметр, нужно написать

Мне не хочется писать какие-то ограничения
И что это вообще за ограничения "," и ">" ?

Во-вторых, я пробовал TMyGeneric<T: ordinal> = class
тоже ругается

Ну и наконец операция сравнения - стандартная операция, для структур можно  определить оператор. Нафига вообще эти IComparable?


Эрик Теодор   (2014-07-09 16:57:00) [10]


>
> там нет про сравнение


да мне просто потрепаться негде))

Эти синтаксис, соответственно, указывает, что T может быть заменен только на:
...
3) на порядковый (ordinal), число с плавающей точкой или запись (один ненулевой тип данных, следуя терминологии Delphi);


V-B. Зачем нужны ограничения?

"Я думал, что генерики предназначены для того чтобы использовать один код сразу для всех типов. Какой смысл в том, чтобы ограничивать используемые типы?"

Ну, ограничения позволяют компилятору получить больше информации об используемых типах. Например, ограничение , позволяет компилятору узнать, что для переменной типа Т, разрешается вызывать метод Free.А из ограничения > сделать вывод, что разрешается использовать Left.CompareTo (Right).


Друг   (2014-07-09 16:53:00) [11]

> Эрик Теодор   (09.07.14 16:38) [4]

там нет про сравнение


Эрик Теодор   (2014-07-09 16:38:00) [12]

http://www.tdelphiblog.com/2009/08/delphi-2009-win32-5.html#LV


Друг   (2014-07-09 16:31:00) [13]

type
 TMyGeneric<T> = class
   class function IsLess(const a, b: T): boolean;
 end;

class function TMyGeneric<T>.IsLess(const a, b: T): boolean;
begin
  Result := (a < b);
end;


[dcc32 Error] TEST_PLATFORM.pas(62): E2015 Operator not applicable to this operand type


brother   (2014-07-09 16:06:00) [14]

> Ругается.

как?


Друг   (2014-07-09 15:55:00) [15]

в качестве T использую Integer


Наверх

Титульная страница Поиск, карта сайта Написать письмо