Ok, I've figured out the answer to question 2:

    void call(Args... args)
    {
        boost::function< void() > bound_fn = boost::bind(f, args...);
        bound_fn(); // in effect the bound_fn will be stored in a queue for later envocation by a different thread
    }

Interested in your comments on my other 2 questions?

Thanks again
Steve

[snip]
1. Please can you give an explanation of what the compiler is actually doing in your make_func_helper() and  make_indexes_...() - This goes beyond my capabilities at the moment, and I'm always looking to improve my knowledge.

3. In attached file "attempt_2.cpp" at Line 27, there's a struct cb_ with a typedef "type" of the member function pointer of the form T::fn(Args...). 

    template< class T, class... Args >
    struct cb_ { typedef void (T::*type)(Args...); };

As far as I can see, this is of the same form as Peter's void (T::*pm)(Args...) member function pointer is it not? How come the compiler can't match &X::f with  typename cb_<T, Args...>::type?
[/snip]