#include <future>
#include <functional>
#include <type_traits>
#include <iostream>

void foo()
{
    std::cout<<"Hello, world!"<<std::endl;
}

template<typename T> struct adv { 
  T t; 
  explicit adv(T &&t):t(std::forward<T>(t)) {} 
  template<typename ...U> T &&operator()(U &&...) { 
    return std::forward<T>(t); 
  } 
}; 

template<typename T> adv<T> make_adv(T &&t) { 
  return adv<T>{std::forward<T>(t)}; 
}

namespace std { 
  template<typename T> 
  struct is_bind_expression< adv<T> > : std::true_type {}; 
} 

int main()
{
     typedef decltype(&foo) foo_type;
     typedef std::result_of<foo_type()>::type foo_rettype;

     auto chosen_async=
       static_cast<std::future<foo_rettype> (*)(foo_type && )>(&std::async<foo_type>);

     auto async_bound=
         std::bind<std::future<foo_rettype>>(chosen_async, 
                                             make_adv(std::forward<foo_type>(&foo)));

     async_bound().wait();
     async_bound().wait();
}