【问题标题】:Fold nested std::future折叠嵌套的 std::future
【发布时间】:2018-01-29 13:33:36
【问题描述】:

我想折叠一个嵌套的std::future,例如

void foo(std::future<int>)
{
}

foo(fold(std::declval<std::future<std::future<std::shared_future<int>>>>());

这是我迄今为止没有成功的尝试。 std::future&lt;void&gt; 变体似乎特别有问题。

有什么建议吗?

#include <future>
#include <type_traits>
#include <string>

namespace detail {

template <typename T>
auto get(T&& f)
{
    return f;
}

auto get(std::future<void>&& f)
{
    return f.wait();
}

auto get(std::shared_future<void> f)
{
    return f.wait();
}

template <typename T>
auto get(std::future<T>&& f)
{
    return detail::get(f.get());
}

template <typename T>
auto get(std::shared_future<T> f)
{
    return detail::get(f.get());
}

}

template <typename T>
auto fold(T&& f)
{
    return std::async(std::launch::deferred, [f = std::move(f)]() mutable
    {
        return detail::get(f.get());
    });
}

【问题讨论】:

  • 您能谈谈使用情况吗?或者只是指定什么 exaclty 不能按预期工作(不编译)?现在,这个问题对我来说有点不清楚

标签: c++ c++14 std future c++17


【解决方案1】:

以下对我有用:

template <typename T>
auto fold(T&& x)
{
    return x;
}

template <typename T>
auto fold(std::future<T>&& f)
{
    return fold(f.get());
}

template <>
auto fold(std::future<void>&& f)
{
    return f.get();
}

测试用例:

auto r0 = fold(std::future<std::future<std::future<int>>>{
    std::async(std::launch::async, [] {
        return std::async(std::launch::async, [] {
            return std::async(std::launch::async, [] { return 0; });
        });
    })});
fold(std::future<std::future<std::future<void>>>{
    std::async(std::launch::async, [] {
        return std::async(std::launch::async, [] {
            return std::async(std::launch::async, [] { return; });
        });
    })});

live example on wandbox.org

【讨论】:

  • 需要一个std::async(std::launch::deferred 否则它将返回一个值而不是未来。
  • @ronag:不,启动策略不会改变返回类型。
  • 删除不需要的std::future&lt;std::future&lt;std::future&lt;int&gt;&gt;&gt;
  • auto fold(T&amp;&amp; x) 不太正确。将左值 future 传递给 fold 并调用重载,而这可能不是您想要的。另外,shared_future 也不见了。
猜你喜欢
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2016-08-23
相关资源
最近更新 更多