読者です 読者をやめる 読者になる 読者になる

C++0x ラムダ式(N2550)

C++

ドラフト(N2588)に入ったラムダ式の概要です


前回までのラムダ式の解説はこちら(N2413, N2487)


【N2487 〜 N2529 までのラムダ式

int min;
int max;

vector<int> v;
find_if(v.begin(), v.end(), <&>(int x)(x > min && x < max));


【最新(N2550)のラムダ式

int min;
int max;

vector<int> v;
find_if(v.begin(), v.end(), [&](int x){ return x > min && x < max; });


環境のキャプチャ(変数ごとの参照方法指定)

【N2487 〜 N2529 までのラムダ式

int min;
int max;

vector<int> v;
find_if(v.begin(), v.end(), <&>(int x) : [max] (x > min && x < max));

<デフォルトのキャプチャ方法(& or = or 空)> (パラメータ) : [キャプチャリスト...] ( 式 )


【最新(N2550)のラムダ式

int min;
int max;

vector<int> v;
find_if(v.begin(), v.end(), [&, max](int x) { return x > min && x < max; });

[デフォルトのキャプチャ方法(& or =), キャプチャリスト...] (パラメータ) { 式 }


デフォルトのキャプチャ方法は「&が参照」で「=がコピー」
キャプチャリストの指定方法は上記の例で説明すると「max(コピー)」「&max(参照)」「this」



戻り値の型指定

find_if(v.begin(), v.end(), [&](int x)->bool { return x > min && x < max; });


例外指定(exception-specification)もできる

find_if(v.begin(), v.end(), [&](int x) throw ->bool { return x > min && x < max; });


あとは、ラムダ式の中にラムダ式を書ける



フルで書くとこうかな

[デフォルトのキャプチャ方法(& or =), キャプチャリスト...(id or &id or this)]
   (パラメータ) 例外指定 ->戻り値の型 { 式(ラムダ式も可) }

個人的には[ ] より < > のほうがよかった(<>のほうがカッコイイから)



それと、まだくわしく調べてないけど
以前まであったnested_functionがreference_closureに名前が変わってる



修正
・return文を書き加えました(2008/03/26)



reference_closure

N2550 Lambda Expressions and Closures: Wording for Monomorphic Lambdas (Revision 4)

C++0x言語拡張まとめ