Delphi : クロージャ(番外編)

IntegerとPointerについては、ラッパーオブジェクトを作る代わりに、こんな方法が使える。ラッパーオブジェクトはオーバーヘッドと解放の手間があるので、使うならこちらの方が有力。

関数を使う

こういう関数でTObjectとの間を変換することができる。

interface

function _i(a: Integer): TObject; overload; register;
function _i(a: TObject): Integer; overload; register;
function _p(a: Pointer): TObject; overload; register;
function _p(a: TObject): Pointer; overload; register;

implementation

function _i(a: Integer): TObject; asm end;
function _i(a: TObject): Integer; asm end;
function _p(a: Pointer): TObject; asm end;
function _p(a: TObject): Pointer; asm end;

これなら、下のように、Integerを使うときは「_i」で、Pointerを使うときは「_p」で、受け渡しをラップすればよい。

function DoEach(obj: TObject): TObject;
  var
    num: Integer;
  begin
    num := _i(obj);
    num := num + num;
    Result := _i(num);
  end;

型の別名をつける

パラメータと返値で違うシンボルを使ってもよいなら、これでもよい。

interface

type
  _i = Integer;
  _p = Pointer;
  _o = TObject;

こんな感じで、IntegerやPointerをキャストして使う。

function DoEach(obj: TObject): TObject;
  var
    num: Integer;
  begin
    num := _i(obj);
    num := num + num;
    Result := _o(num);
  end;