
Kirit Sælensminde wrote:
That makes perfect sense, unfortunately it doesn't help.
From the worker thread example I've removed the specialisation for R(**)(void) - I can't work out why there is a double indirection there, but it might well be contributing to the problem.
I've also changed the functor that does the type handling to this:
template< typename F > boost::shared_ptr< Future< typename boost::function_traits< F
::result_type > > operator()( F f ) { return run< typename boost::function_traits< typename boost::remove_pointer< F >::type >::result_type >( f ); }
The return type should probably be: boost::shared_ptr< Future< typename boost::function_traits< typename boost::remove_pointer<F>::type>::result_type > > But you may want to wrap that up in a small traits class to avoid repeated typing :-) HTH John. PS My simple test case is this: #include <boost/type_traits/function_traits.hpp> #include <boost/type_traits/remove_pointer.hpp> int foo() { return 0; } template <class F> typename boost::function_traits<typename boost::remove_pointer<F>::type>::result_type test_call(F f) { return f(); } int main() { test_call(foo); }