むかしとっても邪道なことを考えてた名残があるので
型安全性を無視するようにアドホックに改竄したうえで、記載しておく。

struct IFV{ virtual int f(void)=0; };
struct IFI{ virtual int f(int n)=0; };
class funb{
void *mic[4];
public:
template<class T> funb(const T &ic, size_t size=16 ){ memcpy( mic, &ic, size); }
int operator ()(int i){ return reinterpret_cast<IFI*>(&mic[0])->f(i); }
int operator ()() { return reinterpret_cast<IFV*>(&mic[0])->f(); }
};
template<class T>class IFI_impl : public IFI{
T &klass;int (T::*method)(int n);
public:
IFI_impl( T &k, int (T::*m)(int n) ):klass(k), method(m){}
virtual int f(int n){ return (klass.*method)(n); }
};
template<class T>class IFV_impl : public IFV{
T &klass;int (T::*method)(void);
public:
IFV_impl( T &k, int (T::*m)(void) ):klass(k), method(m){}
virtual int f(void){ return (klass.*method)(); }
};

template<class T> IFV_impl<T> BindMethod( T &k, int (T::*m)() )
{ return IFV_impl<T>( k, m );}
template<class T>IFI_impl<T> BindMethod( T &k, int (T::*m)(int n) )
{ return IFI_impl<T>( k, m );}