#include <iostream>
using namespace std;

template< typename C>
  class Reg {
  public:
    template< typename R, typename A>
      void register_f( string name, R ( C:: *method_p ) ( A)) { /*registration process*/ }

    template< typename R>
      void register_void_f( string name, R ( C:: *method_p ) ( )) { /*registration process*/ }
  };

  class A {
  public:
      int f( void) { return 1; }
      void g( int x) { /* some code*/ }
  };


int main() {
	Reg< A> r;

	r.register_f( "g", &A::g);
/*1*///    r.register_f( "f", &A::f);
/*2*///    r.register_f< int, void>( "f", &A::f);
/*3*/    r.register_void_f< int>( "f", &A::f);

	return 0;
}