在C++中,要實現(xiàn)類似于JavaScript中的Promise的then
鏈式調(diào)用,你可以使用C++11的std::future
和std::promise
,以及一些模板函數(shù)來封裝這些功能。下面是一個簡單的示例:
#include<iostream>
#include <future>
#include<functional>
#include<vector>
template<typename T, typename Func>
auto then(std::future<T>& future, Func&& func) -> std::future<decltype(func(std::declval<T>()))> {
auto promise = std::make_shared<std::promise<decltype(func(std::declval<T>()))>>();
auto nextFuture = promise->get_future();
std::thread([promise, &future, func]() {
try {
auto result = future.get();
promise->set_value(func(result));
} catch (...) {
promise->set_exception(std::current_exception());
}
}).detach();
return nextFuture;
}
int main() {
// 創(chuàng)建一個異步任務并返回一個std::future對象
std::future<int> future = std::async(std::launch::async, []() {
// 模擬長時間運行的任務
std::this_thread::sleep_for(std::chrono::seconds(1));
return 42;
});
// 使用then鏈式調(diào)用
auto resultFuture = then(future, [](int value) {
std::cout << "Task 1 completed with value: "<< value<< std::endl;
return value * 2;
});
// 獲取最終結(jié)果
int result = resultFuture.get();
std::cout << "Final result: "<< result<< std::endl;
return 0;
}
在這個示例中,我們定義了一個名為then
的模板函數(shù),它接受一個std::future
對象和一個函數(shù)作為參數(shù)。這個函數(shù)將在前一個異步任務完成后被調(diào)用,并將其結(jié)果傳遞給下一個任務。通過這種方式,你可以實現(xiàn)鏈式調(diào)用,就像在JavaScript中使用then
一樣。
請注意,這個示例僅用于演示目的,實際應用中可能需要更復雜的錯誤處理和資源管理。此外,這個示例使用了std::thread
來執(zhí)行異步任務,但在實際項目中,你可能會使用更高級的線程池或任務隊列來管理并發(fā)任務。