2009-02-04 103 views
5

這是我的第一個問題,很高興找到這個網站。Howto轉換爲泛型參數類型的指針?

我的問題涉及Delphi 2009中的新泛型功能。基本上我嘗試爲現有的散列映射實現編寫通用包裝類。現有的實現存儲(String,Pointer)對,所以在包裝類中我必須在泛型參數類型T和指針類型之間進行轉換,反之亦然。

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

end; 

我覺得像這樣的演員(價值:T)

Value := (TObject (Ptr)) as T 

但是,這是行不通的。編譯器告訴我'操作符不適用於此操作數類型'。

有人有一些提示?提前致謝。

回答

10

您需要獲取泛型類型參數類型位置的地址,然後將此地址轉換爲指向所需類型的指針,然後取消引用此指針並將int o由此產生的位置。例如:

PObject(@Value)^ := Ptr; 

你不能強制轉換類型T,其中T是無約束的值的原因,是編譯器不知道T的大小;通常,非數字類型轉換隻能將值轉換爲具有相同大小的類型。

不幸的是,編譯器不夠聰明,無法確定類型約束意味着T保證與指針的大小相同。

此外,目前的Delphi 2009泛型中還存在一個問題,即創建指向類型參數類型的指針。通用指針不是由編譯器支持,但是編譯器允許這樣的語法在類:

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

這可能適用於某些情況下 - 而且可以爲您的具體問題有幫助 - 但它只是偶然的作品,而不是普遍支持。使用風險自負。

0

試試這個:

Value := TObject (Ptr) 

無需投了,因爲分配TObject到泛型類類型變量是有效:)

但我不知道爲什麼你不能使用T用於鑄造...