![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Операция сравнения в дженериках
Друг © (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