The problem exist already for any library proposing a standard future implementation. How can this new implementation works with a standard implementation. This is the case for Boost.Thread, HPX, Boost.AFIO, Boost.Fiber, or your own implementation. What I meant is that we need to change the standard to be able to solve this problem, as the standard don't take it in account.
I believe the solution to is not so much to change (std::)future, but to
push forward 'await' instead. It already has (most) of a
future-type-agnostic synchronization mechanism specified. Granted, the
proposal will change, but I'm certain it will get into C++ in the C++17
timeframe. The 'await' allows to rewrite when_all, etc. such that it works
for any combination of input futures. Here's a sketch (sans decay, etc.):
namespace foobar
{
template <typename Future...>
requires(is_future<Future>)...
future