Распознание типов в Run time

softmaker
Дата: 18.05.2011 10:33:34
Хочу сделать универсальный контейнер. Столкнулся с тем, что либо контейнер содержит данные стандартных типов (integer, string, real), либо объекты (TЛюбоеЧтонибудьОтTObject)

Может как нибудь в Run time можно отличить что находится по указателю на ячейку памяти объект или нет.

Вот интерфейс контейнера: (где __listType задаётся в Design time, а затем то, что ниже подключается {I unitname.inc})
type
  __pListType = ^__listType;

  __cListItem = class
  private
    value      : __pListType;
    next, prev : __cListItem;
  end;

  __cList = class
  private
    list,
    last : __cListItem;

    function GetItem(idx: integer): __listType;
    procedure SetItem(idx: integer; const Value: __listType);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;

    procedure Append(const value : __listType);

    property Items[idx:integer] : __listType read GetItem write SetItem; default;
  end;

Для стандартных типов всё ОК. Dispose(list.value) и всё. А для объектов надо ещё list.value^.Free сделать.
Не хотелось бы делать два разных template'а.

--
Если я рассуждаю логично, это значит только то, что я не сумасшедший, но вовсе не доказывает, что я прав (с)И.П. Павлов
Gust2002
Дата: 18.05.2011 10:51:45
softmaker,

Если я не ошибаюсь, то этот вопрос (про простые типы и указатели) описывается во втором томе "Delphi 5. Руководство разрабочика, Тейксера, Паченко" в разделе про RTTI. Однако, могу и ошибиться читал давно, сам указателями не пользуюсь.
softmaker
Дата: 18.05.2011 10:58:14
Мне нужно различить тип корорый был задан для __listType. Важное отличие - это наследник TObject или встроеный тип.
Два варианта:
1. Design time: чем-нибудь типа {$IFDEF} {$ENDIF};
2. Run time: чем-нибуть типа TypeOf.
Реализовать не получается ни одно, ни другое. Загугливаюсь вторые сутки. Пока ничего.
Может есть мысли?
defecator
Дата: 18.05.2011 10:58:45
softmaker, скажи, а какой смысл имеют подчеркивания в наименовании типов ?
Имхо, дурость какая-то
softmaker
Дата: 18.05.2011 11:01:33
Кусок кода инклюдится. Чтоб не пересечься с чем-нибудь.
Да и какая разница? На функционал не влияет.
Кроик Семён
Дата: 18.05.2011 11:01:44
можно, если хранить в виде
Variant

Посмотри эту потрясающую библиотеку SDL / DeCAL
(вводная статья на русском)
softmaker
Дата: 18.05.2011 11:02:57
Подскажи как TObject в variant запихнуть, а при доставании определить, что это не pointer...
Michael Longneck
Дата: 18.05.2011 11:05:27
CustomVariantType напиши.
softmaker
Дата: 18.05.2011 11:06:25
Про статью: нечто похожее читал. Варианты подходов уже испробовал. Хочется именно универсально и компактно, не сочиняя приблуды на asm'e, которые будут реализовывать собственный RTTI
FlyD
Дата: 18.05.2011 11:09:01
ИМХО, универсализация подобного вида принесет в разы больше гемора, чем практической
пользы и ценности