boost::future .then() 继续返回 boost::future

Posted

技术标签:

【中文标题】boost::future .then() 继续返回 boost::future【英文标题】:boost::future .then() continuations returning boost::future 【发布时间】:2017-05-25 00:50:03 【问题描述】:

我正在阅读关于改进 std::futurestd::promise 的新 C++ 提案,这里是 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3857.pdf,它说

then 函数对象的主体会 本身是一个基于未来的操作,这导致 then() 返回一个未来>。在这种情况下,它几乎总是 如果你真正关心的是内心的未来,那么 then() 在返回之前执行一个隐式的 unwrap()(见下文)。

因此在下面的代码中

auto promise = std::promise<int>;
auto another_future = promise.get_future().then([](auto future) 
    return std::async([]()  return 1; );
);

another_future 的类型是 std::future&lt;int&gt; 而不是 std::future&lt;std::future&lt;int&gt;&gt;

我试图使用boost::future 来实现相同的目标,但似乎 boost 延续并没有隐含地展开未来。我可以做些什么来从提升期货中启用相同的行为吗?似乎也没有 unwrap() 函数可用于生成的功能。

我是否坚持必须手动通过构造函数解开未来?同样在尝试出现以下错误时,我该怎么办?

inline explicit BOOST_THREAD_FUTURE(
    BOOST_THREAD_RV_REF(
        BOOST_THREAD_FUTURE<BOOST_THREAD_FUTURE<R> >) other); // EXTENSION

【问题讨论】:

【参考方案1】:

Unwrapping 是 Boost Thread 的条件扩展:

#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_UNWRAP
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#include <boost/thread.hpp>

int main() 
    auto promise = boost::promise<int>;
    boost::future<int> another_future = 
        promise.get_future().then([](auto) 
            return boost::async([]()  return 1; );
        ).unwrap();

【讨论】:

这三个常量是在你#define BOOST_THREAD_VERSION 4时自动设置的

以上是关于boost::future .then() 继续返回 boost::future的主要内容,如果未能解决你的问题,请参考以下文章

boost::asio 与 boost::unique_future

boost::async 只返回 void?

如何确保 .then() 中的功能在继续之前完成?

执行 .Then() 承诺 NodeJS

ES6 Promise对象then方法链式调用

Aborted fetch 仍在调用“then”函数?