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;