12,925
回編集
46行目: | 46行目: | ||
<br><br> | <br><br> | ||
== | == クロージャの使用例 : 変数の保持 == | ||
以下の例では、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: |