#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8IHR5cGVuYW1lIEM+CiAgY2xhc3MgUmVnIHsKICBwdWJsaWM6CiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgUiwgdHlwZW5hbWUgQT4KICAgICAgdm9pZCByZWdpc3Rlcl9mKCBzdHJpbmcgbmFtZSwgUiAoIEM6OiAqbWV0aG9kX3AgKSAoIEEpKSB7IC8qcmVnaXN0cmF0aW9uIHByb2Nlc3MqLyB9CgogICAgdGVtcGxhdGU8IHR5cGVuYW1lIFI+CiAgICAgIHZvaWQgcmVnaXN0ZXJfdm9pZF9mKCBzdHJpbmcgbmFtZSwgUiAoIEM6OiAqbWV0aG9kX3AgKSAoICkpIHsgLypyZWdpc3RyYXRpb24gcHJvY2VzcyovIH0KICB9OwoKICBjbGFzcyBBIHsKICBwdWJsaWM6CiAgICAgIGludCBmKCB2b2lkKSB7IHJldHVybiAxOyB9CiAgICAgIHZvaWQgZyggaW50IHgpIHsgLyogc29tZSBjb2RlKi8gfQogIH07CgoKaW50IG1haW4oKSB7CglSZWc8IEE+IHI7CgoJci5yZWdpc3Rlcl9mKCAiZyIsICZBOjpnKTsKLyoxKi8vLyAgICByLnJlZ2lzdGVyX2YoICJmIiwgJkE6OmYpOwovKjIqLy8vICAgIHIucmVnaXN0ZXJfZjwgaW50LCB2b2lkPiggImYiLCAmQTo6Zik7Ci8qMyovICAgIHIucmVnaXN0ZXJfdm9pZF9mPCBpbnQ+KCAiZiIsICZBOjpmKTsKCglyZXR1cm4gMDsKfQ==