boost::lambda

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

abstract

必要なヘッダ
<boost/lambda/lambda.hpp> 基本,
<boost/lambda/bind.hpp> 関数を使いたいとき,
<boost/lambda/if.hpp> if, elseを使いたいとき,
<boost/lambda/loops.hpp> for, while,
<boost/lambda/switch.hpp> switch, case,
<boost/lambda/construct.hpp> コンストラクタ,
<boost/lambda/casts.hpp> キャスト,
<boost/lambda/exceptions.hpp> try, catch,
<boost/lambda/algorithm.hpp> STLの標準アルゴリズム,
出来ること
無名関数
リファレンス
en / jp

sample

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

#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/if.hpp>
using namespace std;

int main()
{
	using namespace boost::lambda;

	vector<int> vec;
	vec.push_back(10);
	vec.push_back(23);
	vec.push_back(45);
	vec.push_back(76);
	vec.push_back(98);

	// 5で割り切れて30より大きい要素を探す。

	vector<int>::iterator it =
	  find_if( vec.begin(), vec.end(), _1%5==0 && _1>30 );
	cout << "found:" << *it << endl;

	// それぞれの要素について、
	// 2で割り切れるかそうでないかによってメッセージを表示。

	std::for_each( vec.begin(), vec.end(),
	  if_( _1 % 2 == 0 )[
	    cout << _1 << "は偶数\n"
	  ].else_[
	    cout << _1 << "は奇数\n"
	  ]
	);

	return 0;
}

出力例

found:45
10は偶数
23は奇数
45は奇数
76は偶数
98は偶数

etc

最初の例は要するに、


bool f( int _1 )
{
	return _1%5==0 && _1>30;
}
...
find_if( vec.begin(), vec.end(), f );

と同じ事で、2番目の例は


void g( int _1 )
{
	if( _1 % 2 == 0 ){
	  cout << _1 << "は偶数\n"
	}else{
	  cout << _1 << "は奇数\n"
	}
}
...
for_each( vec.begin(), vec.end(), g );

です。名無しの関数を行の中にワシワシと書き込んで即席で作ってしまうわけですね。 ここまで来るともはやC++に見えなくなってきますが、 頭の体操になってなかなか面白いです。

しかし例えば bind2nd( less<int>(), 10 ) と書くより _1 < 10 と書いた方が遙かに可読性があがることを考えると、 簡単な処理にであれば実際にマジメに使ってみるのも便利かと思います。

see also

このページではlambdaのもっとも簡単な使い方だけサンプルとして提示しましたが、 ループやswitch、例外処理、2変数以上の関数作成など、 ほぼ全機能を網羅したサンプルとして次のページがおすすめです。

また、ラムダ的処理の実装方法が気になる方は、 私が最初のとっかかりだけをちょびっと実装したものがありますので、 よろしければご覧下さい。

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