[英]Howto cast pointer to generic parameter type?
這是我的第一個問題,很高興找到這個網站。
我的問題涉及Delphi 2009中的新Generics功能。基本上我試圖為現有的哈希映射實現編寫一個通用的包裝類。 現有的實現存儲(String,Pointer)對,所以在包裝類中我必須在泛型參數類型T和指針類型之間進行轉換,反之亦然。
type THashMap <T : class> = class
private
FHashList : THashList;
...
end;
我想到了這樣的演員(價值:T)
Value := (TObject (Ptr)) as T
但這不起作用。 編譯器告訴我'運算符不適用於此操作數類型'。
有人有一些提示嗎? 非常感謝提前。
您需要獲取泛型類型參數類型的位置地址,然后將此地址類型轉換為指向所需類型的指針,然后取消引用此指針並分配到結果位置。 例如:
PObject(@Value)^ := Ptr;
你不能僅僅對類型為T的值進行類型轉換,其中T不受約束,是因為編譯器不知道T的大小; 通常,非數字類型轉換只能將值轉換為大小相同的類型。
遺憾的是,編譯器不夠聰明,無法確定類類型約束意味着T保證與指針大小相同。
此外,當前的Delphi 2009泛型存在一個問題,即創建指向類型參數類型的指針。 編譯器不支持通用指針,但編譯器允許在類中使用此語法:
type
C<T> = class
type
PT = ^T; // UNSUPPORTED!
end;
這可能適用於某些情況 - 並且可能對您的特定問題有所幫助 - 但它只是偶然起作用而且通常不受支持。 使用風險由您自己承擔。
試試這個:
Value := TObject (Ptr)
不需要多投射,因為將TObject
分配給泛型類變量是有效的:)
但我不知道為什么你不能首先使用T
進行鑄造......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.