[C++11]ラムダ式(無名関数、匿名関数)とstd::function |
2014年11月21日00:10:24 |
|
ラムダ式とは簡単に言えば関数内に作成できる一時的な関数です。
基本的な書き方はこちら |
1
2
|
[](int a, int b) -> int { return a+b; }; |
呼び出し方は普通の関数と同じ呼び方です。 |
1
2
|
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(int,int) > lambda = [](int a, int b) -> int { return a+b; };
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>
int c = 100;
std::function< int(int,int) > lambda = [=](int a, int b) -> int { return a+b+c; };
int result = lambda(1,2);
std::function< void() > write = [&]() -> void { c=200; };
write();
result = lambda(1,2); |
[=]と[&]は外側全ての変数に対して指定するキーワードですが
安全性を確保する為に個別に指定も可能です。
[]内に使用する変数名をそのまま書けばOKです。
何も付けなければ代入となり&を付けると参照になります。 |
1
2
3
4
5
6
7
8
9
10
| #include <functional>
int c = 100;
int d = 200;
std::function< int(int,int) > lambda = [c,&d](int a, int b) -> int { return a+b+c+d; };
int result = lambda(1,2); |
余談ですが、キャプチャに対してconstを付けたいと思ったのは私だけでしょうか
例えばこんな感じにです。
[const &]
ラムダ式の中で書き換えが行われない事が保証できて安全だと思うのです。
現在の仕様では出来ないようですが、将来的な改善に期待したいです。 |
|