2009-02-04 1 views
5

Это мой первый вопрос здесь, рад, что нашел этот сайт.Как нарисовать указатель на общий тип параметра?

Мой вопрос касается новой функции Generics в Delphi 2009. В основном я попытался написать общий класс-оболочку для существующей реализации хэш-карты. Существующая реализация хранит пары (String, Pointer), поэтому в классе-оболочке я должен указывать между общим типом параметра T и типом указателя и наоборот.

type THashMap <T : class> = class 
private 
    FHashList : THashList; 
    ... 

end; 

Я подумал о гипсе, как это (Value: T)

Value := (TObject (Ptr)) as T 

Но это не работает. Компилятор сообщает мне: «Оператор не применим к этому типу операнда».

У кого-нибудь есть подсказки? Заранее большое спасибо.

ответ

10

Вам нужно указать адрес местоположения типа типа типового типа, затем приведите этот адрес к указателю на нужный тип, а затем разыщите этот указатель и назначьте int o результирующее местоположение. Например:

PObject(@Value)^ := Ptr; 

Причины вы не можете просто типаж значения типа T, где Т непринужденные, является то, что компилятор не знает размера Т; Обычно нечисловые приемы типа могут преобразовывать значения только в типы, имеющие одинаковый размер.

К сожалению, компилятор недостаточно умен, чтобы понять, что ограничение типа класса означает, что T гарантированно будет иметь тот же размер, что и указатель.

Кроме того, существует проблема с текущими генериками Delphi 2009 с созданием указателей для ввода типов параметров. Общие указатели не поддерживаются компилятором, но позволяет компилятор этот синтаксис внутри классов:

type 
    C<T> = class 
    type 
    PT = ^T; // UNSUPPORTED! 
    end; 

Это может работать для некоторых сценариев - и могут быть полезны для вашей конкретной проблемы - но это работает только случайно и не в целом поддерживается. Используйте на свой риск.

0

Попробуйте это:

Value := TObject (Ptr) 

Нет необходимости бросать больше, так как присвоение TObject переменной универсального типа класса действителен :)

Но я не знаю, почему вы не можете использовать T для литья в первую очередь ...