是否支持Delphi XE中的泛型类型?

时间:2011-01-08 20:23:19

标签: delphi delphi-xe

我在D2010上,我必须坚持到64位出来。

使用泛型,不支持指向泛型类型的指针,我发现它们确实非常有用。我在其他地方看过SO(2009年的帖子)巴里凯利爵士认为这可能会在未来发生变化。有谁知道XE是否支持这个?

如果没有,我真的希望他们进入XE2。

感谢。

3 个答案:

答案 0 :(得分:5)

On 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;

您不能拥有泛型函数,但可以使用泛型方法。

因此,您可以使用泛型指针,但请记住,使用这种肮脏的技术没有类型安全性。

答案 1 :(得分:2)

注意:以下答案错误,从错误的前提开始!我没有完整地修改整个事物以保存我的脸红,而是保持原样,以便突出显示错误的注释有意义,

如何安全地支持这个?

鉴于(如果这是你的想法,我认为是这样):

  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 可能会取消引用任何 TFoo of T ,但在任何给定时间它只能引用特定的 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中泛型实现的另一个缺陷。

这是龙......

答案 2 :(得分:2)

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