簡體   English   中英

折疊嵌套std :: future

[英]Fold nested std::future

我想折疊一個嵌套的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上的實時示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM