(Примечание: я не понимаю, как вы заставили boost::unique_future
сотрудничать с std::async
, поэтому я заменил все экземпляры boost::unique_future
на std::future
. Код был протестирован и работает на моем конце.)
Проблема заключается в том, что лямбда-выражения либо захватываются по значению (что на самом деле означает захват по копии), либо по ссылке (здесь не применимо, поскольку мы хотим связать время жизни с нашим замыканием), тогда как std::future
- этодвигаться только.Ответ на этот вопрос обычно std::bind
, хотя в этом случае std::async
имеет встроенную bind
-подобную функциональность:
template<typename T>
auto fold(std::future<T>&& f)
-> std::future<decltype(f.get().get())>
{
return std::async(std::launch::deferred, [](std::future<T>&& f)
{
return f.get().get();
}, std::move(f));
}
У меня нет хорошего имени, чтобы рекомендовать мне 'Боюсь.Если шаблон, возможно, работал рекурсивно для преобразования любого std::future<std::future<std::future<...std::future<T>...>>>
в std::future<T>
, тогда, возможно, я бы позвонил, если flatten_future
.Или, может быть, просто flatten
, поскольку в конце концов он принимает только std::future
.
Предполагая, что у нас уже есть унарный async
:
template<typename Functor, typename Arg, typename... Args>
auto async(Functor&& functor, Arg&& arg, Args&&.... args)
-> decltype( async(std::bind(std::forward<Functor>(functor)
, std::forward<Arg>(arg), std::forward<Args>(args)...)) )
{
return async(std::bind(std::forward<Functor>(functor)
, std::forward<Arg>(arg), std::forward<Args>(args)...));
}