关于Herb Sutter 演讲then()
中函数的实现,我有几个问题。此函数用于链接异步操作,参数是一个操作的未来,参数是此操作的“工作”(lambda)。f
w
template <typename Fut, typename Work>
auto then(Fut f, Work w) -> future<decltype(w(f.get()))>
{
return async([=]{ w(f.get()); });
}
应用示例如下:
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;
});
主线程产生任务,但不等待其中任何一个完成。
首先,future<T>
没有复制构造函数。shared_future<T>
这意味着,除非我们将调用更改async()
为将未来移动到 lambda 中,否则建议的实现只能与一起使用。这个 SO question提出了一种方法,但它似乎太复杂了。我重新实现了这个功能,我想知道我的代码是否正确或者我是否遗漏了什么......
其次,传递给then()
函数的未来可能是void
所以我们实际上需要 2 个实现then()
,对吧?一种用于期货退货T
,一种用于期货退货void
。
最后,内部的 lambda 是否应该then()
没有 return 语句,以便我们可以实际返回值?没有 return 语句,然后返回future<void>
,对吗?
我试图解决以上几点,这就是我想出的。这是对的吗?
template <typename T, typename Work>
auto then(future<T> f, Work w) -> future<decltype(w(f.get()))>
{
return async([](future<T> f, Work w)
{ return w(f.get()); }, move(f), move(w));
}
template <typename Work>
auto then(future<void> f, Work w) -> future<decltype(w())>
{
return async([](future<void> f, Work w)
{ f.wait(); return w(); }, move(f), move(w));
}