12,925
回編集
(→概要) |
|||
46行目: | 46行目: | ||
<br><br> | <br><br> | ||
== | == クロージャの例 1 == | ||
以下の例では、func関数内でローカル変数xを定義して、それをラムダ式でキャプチャしている。<br> | |||
ラムダ式は、変数xの値をコピーキャプチャ [=] して保持する。<br> | |||
<br> | |||
mutableキーワードにより、キャプチャしたxの値を変更可能にしている。<br> | |||
このラムダ式 (クロージャ) は、func関数の実行が終わった後も、キャプチャしたxの値を保持し続ける。<br> | |||
<br> | |||
f1とf2は別々のクロージャインスタンスとなり、それぞれが独自のxのコピーを持つ。<br> | |||
そのため、f1の呼び出しではf1が保持するxが1から3まで増加、f2の呼び出しでは新しいクロージャインスタンスが生成されて、そのxが1から3まで増加する。<br> | |||
<br> | |||
このように、クロージャは状態 (この場合はxの値) を保持でき、その状態は他のクロージャインスタンスとは独立しているという特徴を示している。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
53行目: | 64行目: | ||
{ | { | ||
int x = 0; | int x = 0; | ||
return [=]() mutable -> void | return [=]() mutable -> void { | ||
x++; | |||
x++; std::cout << x << std::endl; | std::cout << x << std::endl; | ||
}; | }; | ||
} | } | ||
62行目: | 73行目: | ||
{ | { | ||
auto f1 = func(); | auto f1 = func(); | ||
f1(); | f1(); // 出力: 1 | ||
f1(); | f1(); // 出力: 2 | ||
f1(); | f1(); // 出力: 3 | ||
auto f2 = func(); | auto f2 = func(); | ||
f2(); | f2(); // 出力: 1 | ||
f2(); | f2(); // 出力: 2 | ||
f2(); | f2(); // 出力: 3 | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
以下の例のように、環境を共有する複数の処理を行う場合は、引数の値により条件分岐することができる。<br> | |||
なお、参照キャプチャは、オブジェクトを複数生成する場合は使用できない。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
89行目: | 92行目: | ||
{ | { | ||
int x = 0; | int x = 0; | ||
return [=](std::size_t mode = 0) mutable -> void | return [=](std::size_t mode = 0) mutable -> void { | ||
switch(mode) { | |||
switch(mode) | |||
case 1: | case 1: | ||
++x; | ++x; | ||
113行目: | 114行目: | ||
auto f2 = func(); | auto f2 = func(); | ||
f1(1); // 1 | f1(1); // 出力: 1 | ||
f1(2); // 出力: 0 | |||
f1(1); // 出力: 1 | |||
f1(2); // 0 | f1(2); // 出力: 0 | ||
f1(); // 出力: 0 | |||
f1( | |||
f2(1); // 出力: 1 | |||
f2( | f2(1); // 出力: 2 | ||
f2(2); // 出力: 1 | |||
f2(2); // 出力: 0 | |||
f2(); // 0 | f2(); // 出力: 0 | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
140行目: | 138行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
{{#seo: | {{#seo: |