boost::function

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

abstract

必要なヘッダ
<boost/function.hpp>
出来ること
汎用関数オブジェクト
リファレンス
en / jp

sample

サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]

#include <iostream>
#include <functional>
#include <boost/function.hpp>
using namespace std;

struct SomeObject
{
	SomeObject( int i_n ) : n( i_n ) {}
	int Do( int x ) { return x*n; }
	const int n;
};

bool f( int x, int y )
{
	return x*x < y;
}

int main()
{
	// intとintを取ってboolを返す2引数関数を格納できる関数オブジェクト
	// とりあえず普通の関数を入れてみる。
	boost::function<bool (int, int)> cmp = &f;
	if( cmp(4, 20) )
	{
		cout << 1 << endl;
	}

	// 途中で関数オブジェクトを突っ込んでみたりする
	cmp = std::not2( std::less<int>() );
	if( cmp(4, 20) )
	{
		cout << 2 << endl;
	}

	// intを取ってintを返す関数。
	// std::binder1st< std::mem_fun1_t<int,SomeObject,int> >
	// などというワケわからん型の変数で受け取らなくても保持できる
	SomeObject t( 3 );
	boost::function<int (int)> g =
		std::bind1st( std::mem_fun(&SomeObject::Do), &t );
	if( 45 == g(15) )
	{
		cout << 3 << endl;
	}

	return 0;
}

出力例

1
3

etc

例えば function<bool (int,int)> であれば、 intとintを取ってboolを返すことが出来るものなら、 関数ポインタでも関数オブジェクトでも区別せず格納することが出来ます。 標準の std::for_each などでは、 渡された関数をtemplateで受け取ってそのまま使って終わりで問題ありませんが、 受け取った関数らしきものをどこかに格納しておいて使い回したいときなど、 こんな感じの汎用関数オブジェクトが威力を発揮します。

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