1

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 が実行時にのみチェックすることです。つまり、(これも)あまり効率的ではありません。コンパイル時にすべてのチェックを行い、選択した型に固有のコードのみを使用するようにコンパイラを作成したいと思います。

4

1 に答える 1

1

確かに、条件付きコンパイルでそのようなことを行うことは期待できません。ジェネリックの条件付きコンパイルは、インスタンス化フェーズではなく、ジェネリック コンパイル フェーズで処理されることに注意してください。そのため、条件ステートメントのさまざまなブランチでさまざまなインスタンス化がコンパイルされることを期待することはできません。

また、 の使用を許可する制約を指定する方法がないためLength(a)、 の型がパラメータ化されている場所をコンパイラに受け入れさせることはできません。aLength

唯一のオプションは実行時チェックです。

于 2013-07-07T20:30:40.393 に答える