溫馨提示×

如何在c++中實現(xiàn)then鏈式調(diào)用

c++
小樊
84
2024-09-16 15:44:43
欄目: 編程語言

在C++中,要實現(xiàn)類似于JavaScript中的Promise的then鏈式調(diào)用,你可以使用C++11的std::futurestd::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ā)任務。

0