Delphiジェネリックにタイプ固有のコードを追加する効率的な方法はありますか? たとえば、次のようなものです。
function TGT<T>.GetSize(a: T): integer;
begin
{$IF TypeInfo(T)=TypeInfo(String)}
result := Length(A);
{$ELSE}
result := SizeOf(A);
{$IFEND}
end;
function TGT<T>.Compare(a,b: T): integer;
begin
{$IF TypeInfo(T)=TypeInfo(String)}
result := AnsiCompareText(a,b);
{$ELSE}
result := a-b;
{$IFEND}
end;
そのため、タイプに応じてさまざまな方法でコードの一部を実装する必要があります。たとえば、Sort ルーチンを実装する場合、integer/double/etc 型の値の直接比較を使用したいと思います (Delphi の標準的なジェネリック コンテナーのようなインターフェイス メソッドの呼び出しよりも効率的です)。
それを行う方法の例がいくつかありますが、それらはすべて次のようなチェックに基づいています。
if TypeInfo(T)=TypeInfo(String) then xxx else if TypeInfo(T)=TypeInfo(Integer) then xxx
ここでの問題は、Delphi が実行時にのみチェックすることです。つまり、(これも)あまり効率的ではありません。コンパイル時にすべてのチェックを行い、選択した型に固有のコードのみを使用するようにコンパイラを作成したいと思います。