「C++の基礎 - クロージャ」の版間の差分

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>
1
なお、参照キャプチャは、オブジェクトを複数生成する場合は使用できない。<br>
2
3
1
2
3
<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
    f2(1); // 1
     f1(2); // 出力: 0
   
     f1(1); // 出力: 1
     f1(2); // 0
     f1(2); // 出力: 0
     f2(1); // 2
     f1();   // 出力: 0
   
     f1(1); // 1
     f2(2); // 1
   
   
     f1(2); // 0
     f2(1); // 出力: 1
     f2(2); // 0
     f2(1); // 出力: 2
      
     f2(2);  // 出力: 1
     f1(); // 0
     f2(2); // 出力: 0
     f2(); // 0
     f2();   // 出力: 0
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
140行目: 138行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>


{{#seo:
{{#seo: