【问题标题】:boost::future .then() continuations returning boost::futureboost::future .then() 继续返回 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

【问题讨论】:

    标签: c++ c++11 asynchronous boost future


    【解决方案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时自动设置的
    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 2014-05-05
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多