Ok, I've figured out the answer to question 2:
[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]