こんなの作ってみたけど、どうよ

inline IMP _METHOD(id __obj, SEL __sel){return [__obj methodForSelector: __sel];}
// _imp = [_obj methodForSelector: _sel]; <<< g++ Bus error

template <typename _Tr = id, typename _Ta1 = id, typename _Ta2 = id, typename _Ta3 = id>
class ImpMethod
{
public:
id_obj;
SEL_sel;
IMP_imp;

ImpMethod<_Tr, _Ta1, _Ta2, _Ta3>(id __obj, SEL __sel) :
_obj(__obj), _sel(__sel), _imp(_METHOD(_obj, _sel)){}

_Tr operator *()
{return ((_Tr (*)(id, SEL, ...))*_imp)(_obj, _sel);}

_Tr impFunc(_Ta1 __arg1)
{return ((_Tr (*)(id, SEL, ...))*_imp)(_obj, _sel, __arg1);}

_Tr impFunc(_Ta1 __arg1, _Ta2 __arg2)
{return ((_Tr (*)(id, SEL, ...))*_imp)(_obj, _sel, __arg1, __arg2);}

_Tr impFunc(_Ta1 __arg1, _Ta2 __arg2, _Ta3 __arg3)
{return ((_Tr (*)(id, SEL, ...))*_imp)(_obj, _sel, __arg1, __arg2, __arg3);}
};