2011-01-08 68 views
6

我在D2010上,我必须待在64位出来。指向Delphi XE支持的泛型类型吗?

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

如果不是,我真的希望他们能够投入XE2。

谢谢。

回答

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

解决此问题的一种方法(不是编译器的限制,而是尝试以类型安全的方式表达某些类型安全性无法表达的内容)的局限性是创建类型特定的派生类型这些类型和使用这些。在点上,你想提领你几乎肯定会知道的类型牛逼反正:

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 

这是可能的,即使在2010年德尔福

然而,令人担忧的是,在调查这个我发现:

p := @a; // Should not compile 

实际上可以编译。哪个打击我是错误的。非常错误。并且可能会指出(但是)Delphi中泛型实现的另一个缺陷。

这里有龙...

+4

龙在这种情况下 ;-)。 –

+0

+1写得很好。你有没有对你的发现做了什么,但不应该编译? –

+0

@Marjan:不。首先,我无法访问XE来确认该错误仍然存​​在 - 如果它已经在XE中修复,那么在2010年没有任何进一步修复2010年的报告,因此没有必要在2010年之前报告它。其次,这可能是由于泛型类TFoo没有实际引用T类型的结果。如果是这样,编译器可能会更严格 - 但我没有测试过这个假设(fwiw,恕我直言,它不应该在任何情况下编译)。但是,因此我认为它“可以”指出一个缺陷,而不是它确实如此。 :) – Deltics

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; 

你不能通用的功能,但你可以有通用的方法。因此,你可以有指向泛型的指针,但记住你没有使用这种肮脏技术的类型安全性。

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

+0

请注意[QualityCentral现在已关闭](https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward),因此您无法再访问'qc.embarcadero.com'链接。如果您需要访问旧的QC数据,请查看[QCScraper](http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/)。 –

+0

我多年来通过下载试用来跟踪他们。在西雅图,我的各种报告都是固定的(实际上在XE7中,但回归模糊了它)。和此代码的通用版本工作:https://stackoverflow.com/questions/848025/rotating-bitmaps-in-code –