簡體   English   中英

如何將指針轉換為泛型參數類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM