这是我的第一个问题,很高兴找到这个网站。
我的问题涉及Delphi 2009中的新Generics功能。基本上我试图为现有的哈希映射实现编写一个通用的包装类。现有的实现存储(String,Pointer)对,所以在包装类中我必须在泛型参数类型T和指针类型之间进行转换,反之亦然。
type THashMap <T : class> = class
private
FHashList : THashList;
...
end;
我想到了这样的演员(价值:T)
Value := (TObject (Ptr)) as T
但这不起作用。编译器告诉我'运算符不适用于此操作数类型'。
有人有一些提示吗?非常感谢。
答案 0 :(得分:10)
您需要获取泛型类型参数类型的位置地址,然后将此地址类型转换为指向所需类型的指针,然后取消引用此指针并将其分配到结果位置。例如:
PObject(@Value)^ := Ptr;
你不能仅仅对类型T的值进行类型转换,其中T不受约束,是因为编译器不知道T的大小;通常,非数字类型转换只能将值转换为大小相同的类型。
不幸的是,编译器不够智能,无法确定类类型约束意味着T保证与指针大小相同。
此外,当前的Delphi 2009泛型存在一个问题,即创建指向类型参数类型的指针。编译器不支持通用指针,但编译器允许在类中使用此语法:
type
C<T> = class
type
PT = ^T; // UNSUPPORTED!
end;
这可能适用于某些情况 - 并且可能对您的特定问题有所帮助 - 但它只能偶然发挥作用,而且通常不受支持。使用风险自负。
答案 1 :(得分:0)
试试这个:
Value := TObject (Ptr)
无需强制转换,因为将TObject
赋值给泛型类变量是有效的:)
但我不知道为什么你不能首先使用T
进行投射......