Static to Instance method trampolining with templates
I will maintain my list of improvements in this answer. 

There is a more succinct way to expose the mechanism to the consumer:

class Final : Base&lt;Final&gt;
{
    register_method&lt;&amp;Final::Foo&gt;( "foo" ); //, static_cast&lt;PHandler&gt;( &amp;Handler&lt;&amp;Final::Foo&gt; ) );
    register_method&lt;&amp;Final::Bar&gt;( "bar" ); //, static_cast&lt;PHandler&gt;( &amp;Handler&lt;&amp;Final::Bar&gt; ) );
    :

class Base
{
    :
    template&lt;PFunc func&gt;
    static void register_method( string name ) {
        methods()[name] = &amp;Handler&lt;func&gt;;
    }
    :


This has extra advantage in that it avoids the following nasty issue:


  Note: (Eelis on IRC) gcc is known not to be able to resolve addresses
  of function template specializations passed to functions. You can work
  around it either by declaring separate variables for the function
  pointers, or using a dirty cast (or a nice cast like
  boost::implicit_cast)


It doubles the number of templated functions getting generated: now 2 are generated for each method instead of one. But at a small price, it is much cleaner to the consumer!

Also function pointer typedef-s could be rewritten:

//typedef void (T::*PFunc)(void);
//typedef void (*PHandler)(void*);

using PFunc = void (T::*)(void);
using PHandler = void(*)(void);


http://ideone.com/ZFQb1f