gpt4 book ai didi

c++ - 折叠嵌套的 std::future

转载 作者:行者123 更新时间:2023-11-28 04:49:36 24 4
gpt4 key购买 nike

我想折叠一个嵌套的 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; });
});
})});

live example on wandbox.org

关于c++ - 折叠嵌套的 std::future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48502519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com