我在D2010上,我必须待在64位出来。指向Delphi XE支持的泛型类型吗?
对于泛型,不支持指向泛型类型的指针,我会发现它们确实非常有用。我在SO的其他地方阅读(2009年发布),巴里凯利爵士认为未来这可能会发生改变。有谁知道这是否支持XE?
如果不是,我真的希望他们能够投入XE2。
谢谢。
我在D2010上,我必须待在64位出来。指向Delphi XE支持的泛型类型吗?
对于泛型,不支持指向泛型类型的指针,我会发现它们确实非常有用。我在SO的其他地方阅读(2009年发布),巴里凯利爵士认为未来这可能会发生改变。有谁知道这是否支持XE?
如果不是,我真的希望他们能够投入XE2。
谢谢。
注意:下面的答案是错误,从它从一个有缺陷的前提开始!我没有修整整个东西来保存我的脸红,而是保持原样,以便突出显示错误的意见是有道理的,
这怎么可能被安全地支持?
考虑(如果这是你的想法,我认为这是):
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中泛型实现的另一个缺陷。
这里有龙...
在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。
请注意[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/)。 –
我多年来通过下载试用来跟踪他们。在西雅图,我的各种报告都是固定的(实际上在XE7中,但回归模糊了它)。和此代码的通用版本工作:https://stackoverflow.com/questions/848025/rotating-bitmaps-in-code –
龙在这种情况下 ;-)。 –
+1写得很好。你有没有对你的发现做了什么,但不应该编译? –
@Marjan:不。首先,我无法访问XE来确认该错误仍然存在 - 如果它已经在XE中修复,那么在2010年没有任何进一步修复2010年的报告,因此没有必要在2010年之前报告它。其次,这可能是由于泛型类TFoo没有实际引用T类型的结果。如果是这样,编译器可能会更严格 - 但我没有测试过这个假设(fwiw,恕我直言,它不应该在任何情况下编译)。但是,因此我认为它“可以”指出一个缺陷,而不是它确实如此。 :) – Deltics