The problem there is in your Task::run() function. It now looks like this in the commit I just saw:
template< typename T,typename ... Args >
future<T>& run( std::function< T( Args ... ) > function,Args ... args )
{
return Task::run<T>( std::bind( std::move( function ),std::move( args ) ... ) ) ;
}
It should look like this for that example to work without the type erasure (haven't tried, there might be typos):
template< typename Fn,typename ... Args >
future<std::result_of_t(Fn(Args...))>& run( Fn&&, Args&& ... args )
{
return Task::run<std::result_of_t(Fn(Args...))>( std::bind( std::forward<Fn>( function ),std::forward<Args>( args ) ... ) ) ;
}
This version is also more efficient, since otherwise you are type erasing twice.