- Код: Выделить всё
type generic TG<G> = class
end;
Так не работает:
- Код: Выделить всё
type generic TGG<G> = class(TG<g>)
end;
Так тоже не работает:
- Код: Выделить всё
type generic TGG<G> = class(TG)
end;
оно вообще возможно?
Модератор: Модераторы
type generic TG<G> = class
end;
type generic TGG<G> = class(TG<g>)
end;
type generic TGG<G> = class(TG)
end;
type generic TGG<G> = class(specialize TG<TObject>)
end;
type generic TGG<G> = class(specialize TG<G>)
end;
generic TContainer<TData> = class
function GetIterator: TIterator<TData>;
end;
generic TIterator<TData> = class
constructor Create(FParent: TContainer<TData>)
end;
TGenericCollection<T: TCollectionItem> = class(TComponent)
...implement TCollection and use T
end;
TCollection = TGenericCollection<TCollectionItem>;
Astralis писал(а):а чтобы понять всю красоту идеи шаблонов, достаточно посмотреть следующие две строки
Я в принципе не понимаю - зачем нужна куча классов с почти одинаковой реализацией?
Verx0Laz писал(а):просто самому интересно
type
generic TArrayOf<TItem> = class(TObject)
var private
FItems: array of TItem;
public
constructor Create;
destructor Destroy; override;
procedure Add(const Item: TItem);
procedure Del(const Item: TItem); overload;
procedure Del(Index: Integer); overload;
function Find(const Item: TItem): Integer;
property Ptr: Pointer; // выдает @FItems[0]
property Items[Index: Integer]: TItem;
property Count: Integer; // заменитель Length/SetLength
end;
TArrayOfVec2f = specialize TArrayOf<TVec2f>;
TArrayOfVec3f = specialize TArrayOf<TVec3f>;
TArrayOfVec4f = specialize TArrayOf<TVec4f>;
TArrayOfMatrix4f = specialize TArrayOf<TMatrix4f>;
Этот пример , что ты приводишь - он всегда и фигурирует. Только вопрос - зачем? Чем тебя обычная колекция не устраивает?
Или обычный динамический массив?
Я вижу от применения шаблонов только непомерное раздувание итогового кода исполняемого файла, ибо всё это в итоге сведётся к томуже копипасту - только скрытому.
Может лучше подумать на этапе постановки задачи и начального проектирования, чтобы исключить такие казусы?
Дож писал(а):С одной стороны жалоба на раздувание кода - "непомерное раздувание итогового кода исполняемого файла".
С другой стороны утверждается, что будет так же - "сведётся к томуже копипасту - только скрытому".
Дож писал(а):TArrayOfVec2f = specialize TArrayOf<TVec2f>;
TArrayOfVec3f = specialize TArrayOf<TVec3f>;
Есть механизм - колекции. Они в принципе могут хрнаить что угодно. Почему не пользоваться ими?
alexs писал(а):Дож писал(а):С одной стороны жалоба на раздувание кода - "непомерное раздувание итогового кода исполняемого файла".
С другой стороны утверждается, что будет так же - "сведётся к томуже копипасту - только скрытому".
А разве это не одно и тоже?
Разве шаблоны в итоге не развораичваются в код?
У тебя будет в коде 2 одинаковых набора методов, только один - для работы с типом <TVec2f>, а второй - <TVec3f>
Это и есть раздувание кода и скрытый копипаст - только не ты его делаеш а компилятор. А результат тот-же - в готовом исполняемом файле куча дублированого кода, который отличается маленьким нюансом - типом обрабатываемых данных
(и то, скоре всего не просто типом, а указателем на этот тип).
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5