我在 D2010 上,我必须坚持到 64 位出来。
使用泛型,不支持指向泛型类型的指针,我会发现它们确实非常有用。我在 SO(2009 年发帖)的其他地方读到了 Barry Kelly 爵士认为这在未来可能会发生变化。有谁知道 XE 是否支持此功能?
如果没有,我真的希望他们能进入 XE2。
谢谢。
在 XE (2011) 上:
这有效:
type
TTest1<T> = record
FX : T;
end;
TTest2<T> = array of T;
这不起作用:
type
TTest3<T> = ^TTest1<T>;
TTest4<T> = ^TTest2<T>;
TTest<T> = ^T;
所以指向泛型的指针是不可能的。
但您可以执行以下操作:
type
TMyClass = class
public
class function GetAddr<T>(const AItem: T): Pointer;
class function GetP<T>(const APtr: Pointer): T;
end;
class function TMyClass.GetAddr<T>(const AItem: T): Pointer;
begin
Result := @AItem;
end;
class function TMyClass.GetP<T>(const APtr: Pointer): T;
begin
Result := T(APtr^);
end;
你不能有泛型函数,但你可以有泛型方法。
因此,有了这个,您就可以拥有指向泛型的指针,但请记住,使用这种肮脏的技术您没有类型安全性。
指向泛型类型的 Afaik 指针仅支持嵌套在泛型内部。
Type
tbwimagegen <T > = Class(TBaseImage)
Type
TLocalType =tbwimagegen <T>;
BaseUnit = T;
RefT= ^BaseUnit;
end;
我使用它是为了可以轻松地按类型切换图像处理代码(T=8、16、32 位整数或 RGBA 记录)。我只是切换专业化,然后使用嵌套类型的代码进行调整。
当然,与所有泛型一样,您只能使用专用类型,因为不会为任何具有通用、非专用类型的代码生成代码。(它只保存到专业化时间)
更新:不幸的是,我遇到了http://qc.embarcadero.com/wc/qcmain.aspx?d=99703 。
注意:以下答案是错误的,因为它是从有缺陷的前提开始的!我没有修改整个内容以保存我的脸红,而是将其保持原样,以便突出显示错误的评论有意义,
这怎么可能得到安全的支持?
给定(如果这是您的想法,我认为是):
type
TFoo<T> = class end;
PFoo<T> = ^TFoo<T>;
那么如果我们有:
var
a, b: TFoo<T>;
p: PFoo<T>;
a := TFoo<String>.Create;
b := TFoo<Integer>.Create;
那么以下两种情况都是允许的:
p := @a;
p := @b;
在任何给定时间p可能取消对T 的任何 TFoo 的引用,但在任何给定时间它只能引用特定的T。我看不到任何类型安全的编译时机制来确保代码正确取消引用p。
解决此问题的一种方法(不是编译器的限制,而是尝试以类型安全的方式表达某些内容的限制,而类型安全根本无法表达)是创建这些类型的特定于类型的衍生物并使用那些。在您希望取消引用时,您几乎肯定会知道T类型:
type
TFoo<T> = class end;
TFooString = TFoo<String>;
PFooString = ^TFooString;
var
p: PFooString;
a := TFoo<Integer>;
b := TFoo<String>;
p := @a; // Should not compile
p := @b; // This is OK
这甚至在 Delphi 2010 中也是可能的。
然而,令人担忧的是,在对此进行调查时,我发现:
p := @a; // Should not compile
实际上可以编译。这让我觉得错了。大错特错。并且可能指向(但)Delphi 中泛型实现中的另一个缺陷。
这里是龙...