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

46行目: 46行目:
<br><br>
<br><br>


== クロージャの例 1 ==
== クロージャの使用例 : 変数の保持 ==
以下の例では、func関数内でローカル変数xを定義して、それをラムダ式でキャプチャしている。<br>
以下の例では、func関数内でローカル変数xを定義して、それをラムダ式でキャプチャしている。<br>
ラムダ式は、変数xの値をコピーキャプチャ [=] して保持する。<br>
ラムダ式は、変数xの値をコピーキャプチャ [=] して保持する。<br>
139行目: 139行目:
<br><br>
<br><br>


== クロージャの使用例 : 非同期処理のコールバック ==
以下の例では、非同期処理のコールバックをクロージャで実装、および、参照キャプチャを使用してカウンタを更新して、<br>
成功・失敗のカウントを保持している。<br>
<br>
<syntaxhighlight lang="c++">
#include <iostream>
#include <functional>
#include <stdexcept>
#include <string>
// 非同期処理を模擬した関数
void simulateAsyncOperation(const std::string& data, std::function<void(bool, const std::string&)> callback)
{
    try {
      // データの検証
      if (data.empty()) {
          throw std::invalid_argument("データが空です");
      }
      // 処理成功時のコールバック実行
      callback(true, "処理結果: " + data);
    }
    catch (const std::exception& e) {
      // エラー発生時のコールバック実行
      callback(false, std::string("エラー: ") + e.what());
    }
}
int main()
{
    int successCount = 0;  // 成功回数をカウント
    int failureCount = 0;  // 失敗回数をカウント
    // クロージャを作成
    // 成功・失敗のカウントを保持
    auto resultHandler = [&successCount, &failureCount](bool success, const std::string& result) {
      if (success) {
          successCount++;
          std::cout << "成功 (" << successCount << "回目): " << result << std::endl;
      }
      else {
          failureCount++;
          std::cout << "失敗 (" << failureCount << "回目): " << result << std::endl;
      }
    };
    // クロージャの実行
    simulateAsyncOperation("テストデータ1", resultHandler);
    simulateAsyncOperation("テストデータ2", resultHandler);
    simulateAsyncOperation("", resultHandler);            // エラーケース
 
    return 0;
}
</syntaxhighlight>
<br><br>


{{#seo:
{{#seo: