インクルード ファイルを使用して Delphi でセミジェネリック コンテナを作成するための古いハックがあります。
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=453&mode=printを参照し、3D リストから始めてアイデアを把握してください。
interface
ただし、ユニットとセクションに 2 つの相互に依存する 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\>
PPS。面白いことに、内部型をコピペで再構築
TIntList = array[0..Maxint div (sizeof(Integer)*sizeof(_DATA_TYPE_)) - 1] of _DATA_TYPE_;
エラーを「const式が必要です」に変更します。
したがって、同じ式は、コンパイラのあるブランチでは const-enough と見なされ、別のブランチでは non-const と見なされます...それ自体が不整合バグを構成するのではないかと思います。