2009-02-04 98 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用于铸造...