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` 中。然后我们获取异步任务的结果,并在另一个线程中执行该任务,最后输出异步任务的结果。这样就实现了一个简单的异步任务执行过程。希朿这个例子有帮助!如果有任何疑问,请随时提出。
标签:std,异步,task,函数,创建,packaged,C++,任务 From: https://www.cnblogs.com/music-liang/p/18092499