Delphiで関数内関数を関数ポインタとして引き渡す
僕が愛用しているEOFile作者さんのところに、こんな記事があるのですが、
http://hp.vector.co.jp/authors/VA028375/delphi/delphipascal_xx_lambda.html
ここまで手の込んだことをしなくても、単純な関数ポインタとして関数内関数を渡すことは実はそんなに難しいことではなかったのですね。つまり、Pointer型に代入してやって、使うときに関数型にキャストしてやればいいのです。気をつけることは、親関数の変数やSelfオブジェクトに触らないようにすることです。これは結構便利です。
procedure SomeFunction(x: Integer; y: [0,1]) type TFunc = function (z: Integer): Integer; function RunSubFunction(pfunc: Pointer; z: Integer): Integer; var func: TFunc; begin func := TFunc(pfunc); Result := func(z); end; function SubFunc1(z: Integer): Integer; begin Result := z*2; end; function SubFunc2(z: Integer): Integer begin Result := z*z; end; begin case y of 0: Result := RunSubFunction(@SubFunc1, x); 1: Result := RunSubFunction(@subFunc2, x); end; end;