C++プログラマ キャスブログ
[C++11]ラムダ式(無名関数、匿名関数)とstd::function 2014年11月21日00:10:24
ラムダ式とは簡単に言えば関数内に作成できる一時的な関数です。 基本的な書き方はこちら
1 2 // [キャプチャ指定※後述](引数) -> 戻り値の型{ 処理; } [](int a, int b) -> int { return a+b; };
呼び出し方は普通の関数と同じ呼び方です。
1 2 // resultには3が入ります。 int result = [](int a, int b) -> int { return a+b; }( 1, 2 );
上記のような使い方は全く意味がありませんね。 処理をそのまま書いておけって感じです。 そこで関数ポインタに入れることによって効力を発揮するのですが 無名関数、匿名関数といいつつも関数ポインタには代入出来ません。 な、なんてこったー!! ということでstd::functionを利用しましょう。
1 2 3 4 5 6 7 8 9 10 #include <functional> //std::functionを利用するためのヘッダー // 残念ながら関数ポインタには代入できません。 // int (*lambda)(int,int) = [](int a, int b) -> int { return a+b; }; // std::functionを使いましょう。 std::function< int(int,int) > lambda = [](int a, int b) -> int { return a+b; }; // 呼び方 resultには3が入ります int result = lambda(1,2);
お待たせしました。キャプチャについての説明です。 ラムダ式は外側のスコープの変数にアクセスできます。 その機能のことをキャプチャと呼びます。 書き方は先ほどの[]の中に指定子を書きます。 [=] 外側のスコープの変数はコピーとして扱います。 [&] 外側のスコープの変数は参照として扱います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <functional> //std::functionを利用するためのヘッダー int c = 100; // 外側の変数をコピーとして扱う[=] std::function< int(int,int) > lambda = [=](int a, int b) -> int { return a+b+c; }; // resultには103が入ります int result = lambda(1,2); // 外側の変数を参照として扱う[&] // cは200に置き換わります。 std::function< void() > write = [&]() -> void { c=200; }; write(); // cを200に書き換えたのでresultには203が入ると勘違いしがちですがlambda作成時の // 変数cの100がコピーされた状態で残っているので103となります。 // ここを203としたい場合にはlambdaの指定を[&]参照にしておく必要があります。 result = lambda(1,2);
[=]と[&]は外側全ての変数に対して指定するキーワードですが 安全性を確保する為に個別に指定も可能です。 []内に使用する変数名をそのまま書けばOKです。 何も付けなければ代入となり&を付けると参照になります。
1 2 3 4 5 6 7 8 9 10 #include <functional> //std::functionを利用するためのヘッダー int c = 100; int d = 200; // [c,&d] cは代入 dは参照 std::function< int(int,int) > lambda = [c,&d](int a, int b) -> int { return a+b+c+d; }; // resultには303が入ります int result = lambda(1,2);
余談ですが、キャプチャに対してconstを付けたいと思ったのは私だけでしょうか 例えばこんな感じにです。 [const &] ラムダ式の中で書き換えが行われない事が保証できて安全だと思うのです。 現在の仕様では出来ないようですが、将来的な改善に期待したいです。
カテゴリ

リンク
C++11のコードを
試すのに便利です。
http://ideone.com/

同人ゲームを
製作している知人
sorcery

にほんブログ村 IT技術ブログ C/C++へ
にほんブログ村


C++ ブログランキングへ

ゲームダウンロード DefenceTri