“压平”嵌套期货
我有一个辅助函数,用于将嵌套的 future“展平”为单个 future:
编辑:按照建议将“fold”重命名为“展平”。
我正在使用 boost 库中的 futures:
template<typename T>
auto flatten(boost::unique_future<T>&& f) -> boost::unique_future<decltype(f.get().get())>
{
auto shared_f = boost::shared_future<T>(std::move(f));
return async(launch_policy::deferred, [=]() mutable
{
return shared_f.get().get();
});
}
它的使用方式如下:
auto nested_future_result = async([]() -> boost::shared_future<int>
{
auto tmp = async([]
{
return 1;
});
return boost::shared_future<int>(std::move(tmp));
});
boost::unique_future<int> future_result = flatten(nested_future_result);
int result = future_result.get();
问题是,只有当我将“嵌套”future 转换为 shared_future
时,这才有效。有什么好的方法可以绕过它吗?我想要的是这样的:
auto future_result = flatten(async([]
{
return async([]
{
return 1;
});
}));
int result = future_result.get();
其次,我有点不确定该方法的名称。有什么意见吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
(注意:我不明白你如何让
boost::unique_future
与std::async
配合,所以我替换了boost::unique_future< 的所有实例/code> 和
std::future
代码已经过测试并且可以在我这边运行。)问题是 lambda 表达式要么按值捕获(这实际上意味着通过复制捕获),要么按引用捕获(不适用于我们想要的这里将 future 的生命周期与我们的闭包联系起来),而 std::future 是仅移动的。答案通常是
std::bind
,尽管在本例中std::async
具有内置的类似bind
的功能:恐怕我没有好名字可以推荐。如果模板可能递归地转换任何
std::future...>>>
到std::future
那么也许我会调用 ifflatten_future
。或者也许只是展平
,因为毕竟它首先只接受std::future
。假设我们已经有一个一元
async
:(Note: I don't understand how you got
boost::unique_future
to cooperate withstd::async
so I replaced all instances ofboost::unique_future
withstd::future
. The code has been tested and works on my end.)The issue is that lambda expressions either capture by value (which really means capture by copy) or by reference (not applicable here as we want to tie the lifetime of the future to our closure), whereas
std::future
is move-only. The answer to that is usuallystd::bind
, although in this casestd::async
has a built-inbind
-like functionality:I don't have a good name to recommend I'm afraid. If the template perhaps worked recursively to transform any
std::future<std::future<std::future<...std::future<T>...>>>
tostd::future<T>
then perhaps I'd call ifflatten_future
. Or perhaps simplyflatten
, since after all it only accepts anstd::future
in the first place.Assuming we already have a unary
async
: