C++ 折叠嵌套std::future

C++ 折叠嵌套std::future,c++,c++14,std,future,c++17,C++,C++14,Std,Future,C++17,我想折叠一个嵌套的std::future,例如 这是我到目前为止一直没有成功尝试过的。它似乎特别与std::future变体有关 有什么建议吗 #include <future> #include <type_traits> #include <string> namespace detail { template <typename T> auto get(T&& f) { return f; } auto get(

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

这是我到目前为止一直没有成功尝试过的。它似乎特别与std::future变体有关

有什么建议吗

#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());
    });
}

以下是我的作品:

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; });
        });
    })});

你能谈谈用法吗?或者只指定Exaclity不按预期工作而不编译的内容?现在,问题有点不清楚,是否需要std::asyncstd::launch::deferred,否则它将返回一个值而不是未来。@ronag:不,启动策略不会更改返回类型。删除std::future它不需要。auto foldT&&x不太正确。将一个左值未来传递给fold,然后调用重载,而这可能不是您想要的。此外,共享的未来也缺失了。
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; });
        });
    })});