c#和java中都有直接提供方法实现异步执行一个任务,并在其执行完成后执行指定的任务。然而c++11却没有直接提供类似的实现。虽然用c++98的泛型和直接使用系统线程也能实现,不过要实现好还是很复杂。现在有了c++11,就可以用其中的 std::async 和 lambda方便地实现了。
在前面的任务执行完成后,可能会返回一个值,也可能不会返回值,后续的任务虽然大部分情况都需要使用到返回的值但也可以选择性忽略返回值。因此提供了两个函数,一个将当前返回值传给下一个函数,另一个忽略返回值。
实现:
#ifndef __ASYNC_TASK
#define __ASYNC_TASK
#include <functional>
#include <future>
#include <utility>
template <typename T>
class Task;
template <typename R, typename... Args>
class Task < R(Args...) >
{
public:
using return_type = R;
template <typename F, typename... exArgs>
auto then(F&& f, exArgs&&... args) -> Task < typename std::result_of<F(exArgs...)>::type(void) >
{
using thRType = typename std::result_of<F(exArgs...)>::type;
auto func = std::move(m_fn);
auto thFn = std::bind(std