Sutter вот так в презентации советовал:
template<typename Fut, typename Work>
auto then(Fut f, Work w)->std::future<decltype(w(f.get()))>
{ return std::async([=] { w(f.get()); }); }
std::launch::async
и использовать shared_future? Или это портить обобщённость шаблона?