トップページ > 関数型プログラミング >
サンプルの動作確認バージョン [GCC4.4/1.40.0] [VC9/1.40.0]
#include <iostream>
#include <string>
#include <iterator>
#include <functional>
#include <algorithm>
#include <boost/bind.hpp>
using namespace std;
bool is_ordered( int a, int b, int c )
{
return a<=b && b<=c;
}
int main()
{
{
// 7以上12以下の最初の要素を探す。
// is_orderedに定数をbindして(くくりつけて)、
// 「is_ordered(7,第一引数,12)」と等価な
// 関数オブジェクトを作っているわけです。
int arr[] = {1,2,3,4,5,6,7,8,9,10};
const int len = sizeof(arr) / sizeof(arr[0]);
int* f = find_if( arr, arr+len,
boost::bind(is_ordered, 7, _1, 12) );
cout << *f << endl;
}
{
// 各文字列の1番目から3文字を順にcoutへ出力する。
// 「第一引数.substr( 1, 3 )」と等価な関数オブジェクトを
// 作っています。bindにメンバ関数を渡すと、
// 自動的にクラス変数を第一引数に取る関数に
// 読み替えてくれます。
// boost::mem_fn参照のこと。
string arr[] = {"hello","my_name","is_k","inaba.","bye!"};
const int len = sizeof(arr) / sizeof(arr[0]);
transform( arr, arr+len, ostream_iterator<string>(cout),
boost::bind(&string::substr, _1, 1, 3) );
cout << endl;
}
{
// 大きい順に並べ替え。
// 「less<int>()(第二引数、第一引数)」
// と等価な関数オブジェクトです。引数を逆にしただけ。
int arr[] = {7,3,4,9,1,2,5,8};
const int len = sizeof(arr) / sizeof(arr[0]);
sort( arr, arr+len,
boost::bind(less<int>(), _2, _1) );
copy( arr, arr+len, ostream_iterator<int>(cout) );
cout << endl;
}
return 0;
}
7 elly_ns_knabye! 98754321
2変数関数があるとき、 その片方の引数だけ固定して1変数関数として扱えると時々便利です。 例えば大小比較の関数の片方を定数にして、「この数より大きいかどうか?」 のチェックをする関数に変えてしまうなど。この目的で、C++ の標準ライブラリにはbind1st、bind2ndという二つの関数が入っています。
で、このboost::bindはその強化版。2変数などとケチなことを言わずに、 3変数でも4変数でも扱えます。あと、クラスのメンバ関数を渡すときに、 mem_fun などのような特殊なアダプタを使わずに書くことも可能。 boost::mem_fn 的に bind 側で適切に処理してくれます。