2010年7月17日土曜日

C++のfunctor

functorについてはここが詳しい。下のほうにPDFも付いている。
functorは状態の付いた関数。C++では状態を保存するための複数のプライベート関数と関数を実行するためのオーバーロードされたオペレータ( )をともなうクラスとして実現できる。C++ではテンプレートと多態性を使ってカプセル化できる。
基底クラスで仮想関数として関数を提供するのだが、メンバー関数を"Call"のような関数とするかオーバーロードされたオペレータとするかは好みの問題。基底クラスからテンプレートの派生クラスを生成し、オブジェクトへのポインタとメンバー関数へのポインタをコンストラクタの中で初期化する。派生クラスでCall関数か( )オペレータをオーバーライドする。
functorのいいところは、関数を呼び出すときにオブジェクトへのポインタが必要ない、つまりクラスを意識する必要がなく、普通の関数として使えることだ。またC++の場合インライン化できるのでパフォーマンスもよい。
functorをどこで使うかというと、パラメータを推定するためにカルマンフィルタで尤度を最大化するときに使う。準ニュートン法(BFGS)で非線形最適化をするときに尤度関数をfunctorとして渡す。この3連休で早いとこ、このプログラムを仕上げたいよ。

0 件のコメント: