怎么写。然后使用std :: future

时间:2016-01-08 03:45:02

标签: c++11

我有一个简单的任务类:

template<typename TType>
class YHMTask
{
public:
    YHMTask() {};
    template<typename TLambdaFun>
    auto then(TLambdaFun f) -> std::future<decltype(f(mTask.get()))>
    {
        std::move(mTask);
        return std::async(std::launch::async, f, mTask.get());
    }
    std::future<TType> mTask;
private:
};

在此代码中,.then可以使用并返回std :: future。

但我想要。然后返回另一个YHMTask,以便我可以在.then之后调用.then。 我试着改变。然后代码:

template<typename TLambdaFun>
auto then(TLambdaFun f) -> YHMTask<decltype(f())>
{
    std::move(mTask);
    std::async(std::launch::async, f, mTask.get());
    YHMTask<decltype(f())> yhmTask(std::move(this));
    return yhmTask;
}

然后打电话给.then:

auto testTask = YHMCreateTask(PostAsync(L"", L"")).then([=](wstring str)
{
    return 1;
});

Compilier给我这个错误:

error C2672: 'YHMTask<std::wstring>::then': no matching overloaded function found
error C2893: Failed to specialize function template 'YHMTask<unknown-type> YHMTask<std::wstring>::then(TLambdaFun)'

我该怎么办?

2 个答案:

答案 0 :(得分:1)

创建yhmTask时,您正在移动this,这是一个指针。 YHMTask没有构造函数指向YHMTask,因此模板特化失败。在移动它之前,您应该取消引用this

YHMTask<decltype(f())> yhmTask(std::move(*this));

答案 1 :(得分:0)

听起来你有兴趣将std :: future扩展为.then()。我建议你看看Futures for C++ at Facebook。它会做你想做的事情以及更多。

使用then来链接序列任务:

Future<double> fut =
  fooFuture(input)
  .then(futureA)
  .then(futureB)
  .then(futureC)
  .then(d)
  .then([](OutputD outputD) { // lambdas are ok too
    return outputD * M_PI;
  });

还提供其他compositional building blocks,例如collect,map和reduce。 Git回购here。看起来C++17也可能支持.then构造。