namespace Core { /** * 創建一個異步任務的包裝函數,返回一個指向 std::packaged_task 的 shared_ptr。 * * @tparam F 函數類型 * @tparam Args 參數類型 * @param f 要執行的函數 * @param args 函數的參數 * @return 指向 std::packaged_task 的 shared_ptr */ template <class F, class... Args> auto makeFutureTask(F &&f, Args &&...args) -> std::shared_ptr<std::packaged_task<typename std::result_of<F(Args...)>::type()>> { using return_type = typename std::result_of<F(Args...)>::type; auto task = std::make_shared<std::packaged_task<return_type()>>( std::bind(std::forward<F>(f), std::forward<Args>(args)...)); return task; } #define MAKE_FUTURE_TASK(F) [task] { (*task)(); } }
這段C++代碼定義了一個函數模板 `makeFutureTask` 和一個宏 `MAKE_FUTURE_TASK`,它們結合使用可以用來創建異步任務。
1. **makeFutureTask 函數模板**:
- 參數:
- `F &&f`:表示一個可調用對象(函數、函數指針、lambda 表達式等);
- `Args &&...args`:表示可變數量的參數,用於傳遞給可調用對象 `f`。
- 返回類型:
- `std::shared_ptr<std::packaged_task<typename std::result_of<F(Args...)>::type()>>`:返回一個指向 `std::packaged_task` 的智能指針,`packaged_task` 是一個異步任務的包裝類,它可以異步執行一個可調用對象,並獲取其結果。
作用:
- 該函數模板的作用是創建一個異步任務(`std::packaged_task`),並返回指向該任務的智能指針。
- 使用 `std::bind` 將可調用對象 `f` 與參數 `args` 綁定,創建一個 `packaged_task` 對象,並將其存儲在智能指針中返回。
2. **宏 MAKE_FUTURE_TASK**:
- 定義了一個 lambda 表達式,捕獲了名爲 `task` 的變量(即 `std::shared_ptr<std::packaged_task>`)。
- lambda 表達式的主體是調用 `(*task)()`,即執行 `packaged_task` 中所包裝的可調用對象。
現在讓我們來看一個示例,演示如何使用這些代碼來創建異步任務:
#include <iostream> #include <future> #include <functional> // 定義一個函數用於異步執行 int add(int a, int b) { return a + b; } int main() { // 創建一個異步任務,計算 3 + 4 auto task = makeFutureTask(add, 3, 4); // 使用 std::future 來獲取異步任務的結果 std::future<int> future = task->get_future(); // 在另一個線程中執行異步任務 std::thread(std::move(*task)).detach(); // 獲取異步任務的結果並輸出 std::cout << "Result: " << future.get() << std::endl; return 0; }
在這個示例中,我們使用 `makeFutureTask` 函數模板創建了一個異步任務,將 `add` 函數和參數 3、4 綁定到一個 `std::packaged_task` 中。然後我們獲取異步任務的結果,並在另一個線程中執行該任務,最後輸出異步任務的結果。這樣就實現了一個簡單的異步任務執行過程。希朿這個例子有幫助!如果有任何疑問,請隨時提出。