さて、いよいよ boost 本領発揮。 関数アダプタ第二号です。 サンプルコード。
まあ、使い方はサンプル見ればわかると思うんだけどなあ。 使うだけならそんなに難しくない、はず。
まず、カリー化を知ってるとわかりやすいと思います。 やねうらお氏 がわかりやすい説明して下さっているので、 見て下され。
まず、mem_fn が何をやっているかですが、 メソッドが . 演算子で呼びだすものなら、mem_fun_ref相当の動作を、 -> 演算子で呼びだすものなら、mem_fun相当の動作をします。 まあ、テンプレート特別バージョンの守備範囲。 この時、STLのものと違い、引数の個数が二個以上でも OK です。
次、bind。 第一引数に関して、メソッドなら自動的に mem_fn を適用します。 これもテンプレート特別バージョン。
第二引数以降は、関数なら引数の個数、メソッドなら引数の個数+1個の 引数を指定します。
これらの引数には、bindしたい値か、_1, _2, _3, ... を指定します。 bindしたい引数が、参照なら、boost::ref で包みます。
で、_1, _2, _3, ... で指定した部分が、 boost::bindの返す関数オブジェクトの引数になります。 つまり
(任意引数個の関数) => (任意引数個以下の引数個の関数)
という変換をやってくれるわけです。 ああ、ちなみに引数の個数は減らないのもアリです。 (サンプルコードの最後の例)
これで、ああ、カリー化やねえ、と理解してくれないと、 これ以上の説明は凄く長くなりそうできついっす。 すいません。
ちなみにこれ使うとコンパイルが異常に遅くなります。
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。