在 Delphi 中使用包含文件制作半通用容器有一个古老的技巧。
请参阅http://www.delphikingdom.com/asp/viewitem.asp?catalogid=453&mode=print并从 3d 列表开始以掌握这个想法。
interface
然而,在单元和部分中有两个相互依赖的 INC 文件implementation
会导致麻烦:似乎 XE2 将这些包含文件编译为独立单元,并且实现找不到接口中声明的函数。它不会每次都发生,但我未能确定条件,因此未能解决问题。
试图在 Delphi 泛型单元中以尽可能少的变化重新制定它(我不得不将巨大的遗留项目移至 XE2 并且“工作”应该是第一个,稍后进行优化和重构),我陷入了以下坑:
TemplateList<_DATA_TYPE_> = class
public
const MaxListSize = Maxint div (sizeof(Integer)*sizeof(_DATA_TYPE_));
type
TIntList = array[0..MaxListSize - 1] of _DATA_TYPE_;
PIntList = ^TIntList;
private
FList: PIntList;
FCount: Integer;
这给出了一个错误,即 Low-boundTIntList
高于 High-bound。我认为,这意味着它const MaxListSize
被评估为零,但TIntType
尝试立即评估,而不是在实际实例化类型时。
我想知道 XE3 或 XE4 是否解决了这个问题。如果有一种方法可以在 XE2 中编译而不需要进行重大的重新工作
PS。使数组 0..0 并抑制边界检查是通常的解决方案,但它会产生许多脆弱的未检查代码。也许我最终会使用真实的TList
,或者TList<integer\>
...
聚苯乙烯。有趣的事情,用复制粘贴重新形成内部类型
TIntList = array[0..Maxint div (sizeof(Integer)*sizeof(_DATA_TYPE_)) - 1] of _DATA_TYPE_;
将错误更改为“需要 const 表达式”。
因此,相同的表达式在编译器的一个分支中被认为是足够的,而在另一个分支中被认为是非常量的......我想知道它本身是否构成了一个不一致的错误。