我then()
在Herb Sutter的演讲中有一些关于函数实现的问题.此函数用于链接异步操作,参数f
是一个操作的未来,参数w
是此操作的"工作"(lambda).
template <typename Fut, typename Work>
auto then(Fut f, Work w) -> future<decltype(w(f.get()))>
{
return async([=]{ w(f.get()); });
}
Run Code Online (Sandbox Code Playgroud)
申请的一个例子是:
std::future<int> f = std::async([]{
std::this_thread::sleep_for(std::chrono::microseconds(200));
return 10;
});
auto f2 = then(std::move(f), [](int i){
return 2 * i;
});
Run Code Online (Sandbox Code Playgroud)
主线程产生任务但不等待它们中的任何一个完成.
首先,future<T>
没有复制构造函数.这意味着,shared_future<T>
除非我们将调用更改async()
为将未来移动到lambda ,否则建议的实现只能用于.这个问题提出了一种方法,但似乎太复杂了.我重新实现了这个功能,我想知道我的代码是否正确或是否遗漏了一些东西......
其次,传递给then()
函数的未来可能是void
这样,我们实际上需要2个实现then()
,对吧?一个用于期货回归T
,一个用于期货回归void
.
最后,如果body内的lambda then()
没有return语句,那么我们实际上可以返回值吗?如果没有return语句,那么返回future<void>
吧?
我试图解决上述问题,这就是我想出的.这是对的吗?
template <typename T, typename …
Run Code Online (Sandbox Code Playgroud)