boost::bind

トップページ > 関数型プログラミング >

abstract

必要なヘッダ
<boost/bind.hpp>
出来ること
引数の束縛
リファレンス
en / jp

sample

サンプルの動作確認バージョン [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

etc

2変数関数があるとき、 その片方の引数だけ固定して1変数関数として扱えると時々便利です。 例えば大小比較の関数の片方を定数にして、「この数より大きいかどうか?」 のチェックをする関数に変えてしまうなど。この目的で、C++ の標準ライブラリにはbind1st、bind2ndという二つの関数が入っています。

で、このboost::bindはその強化版。2変数などとケチなことを言わずに、 3変数でも4変数でも扱えます。あと、クラスのメンバ関数を渡すときに、 mem_fun などのような特殊なアダプタを使わずに書くことも可能。 boost::mem_fn 的に bind 側で適切に処理してくれます。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0