折叠嵌套标准::未来

Fold nested std::future

本文关键字:未来 标准 嵌套 折叠      更新时间:2023-10-16

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

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

这是我到目前为止不成功尝试的。它似乎特别存在std::future<void>变体的问题。

有什么建议吗?

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

wandbox.org 上的现场示例