元気にしてたかな子供たち。おじさんは花粉症だか風邪だかわからない感じになってしまって困っているよ。今日なんかもう40日分くらいのプログラムを書いてしまったのでこれじゃーますます悪化するばかりだなー。
以前参照引数受け取りにも対応した自作bind1stを紹介したけど、本日ついに参照引数受け取りにも対応した自作bind2ndが欲しくなったのでまたまた作ってみたよ。ま、やってりゃいつかは必要になるのはわかってたんだけどやや間が開き過ぎた感もあるが。本当は例えばC++0xとかになりゃこういう隙間埋めるような自作ファンクタも必要なくなるよなっていうパターン(例えばの話)が一番いいって思ってるんだけどね。どうなんだろー。
何というかこう、テンプレートって書いてるときは簡単なんだけど解読するとなると一苦労だな。自分が昔書いたものとは言え、ぱっと見で一瞬わけがわからなかったよ。まあすぐ思い出すんだけどさ。
さて使い方は自明なので省略するぞ。諸々の説明は、自作bind1stの方を参照してほしい。remove_modifierの説明もそこに詳しい。じゃね!
// my_bind2nd_ref template< class Func, class Para > class my_bind2nd_ref_t : public unary_function< typename Func::first_argument_type, typename Func::result_type > { public: typedef typename nurs::remove_modifier < typename Func::second_argument_type >::base_type Vtype; my_bind2nd_ref_t( Func func, Para para ) : _func( func ), _para( para ){} result_type operator()( const typename Func::first_argument_type& t ) const { return _func( t, _para ); } typedef typename Func::result_type result_type; typedef typename Func::second_argument_type argument_type; Func _func; mutable Para _para; }; template< class Func, class Para > my_bind2nd_ref_t< Func, Para > my_bind2nd_ref( Func func, Para para ) { return my_bind2nd_ref_t< Func, Para >( func, para ); }