6

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

使用泛型,不支持指向泛型类型的指针,我会发现它们确实非常有用。我在 SO(2009 年发帖)的其他地方读到了 Barry Kelly 爵士认为这在未来可能会发生变化。有谁知道 XE 是否支持此功能?

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

谢谢。

4

3 回答 3

5

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

你不能有泛型函数,但你可以有泛型方法。

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

于 2011-01-08T20:45:08.977 回答
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 。

于 2011-01-08T21:54:34.750 回答
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可能取消对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 中泛型实现中的另一个缺陷。

这里是龙...

于 2011-01-08T20:44:07.670 回答