You can't avoid passing the instance if you want to call a non-static method on that instance, unless you don't mind calling it on a temporary, default-constructed instance:
template<typename C, typename Arg>
int call_on_temp(int (C::*func)(Arg), Arg a)
{
C temp;
temp.*func(a);
}
or the caller explicitly binds the instance into a functor:
template<typename F, typename Arg>
int call_on_functor(F func, Arg a)
{
func(a);
}
which makes the call site ugly:
call_on_functor(std::bind(std::mem_fn(&Class::method), instance), arg);
(and you still need the instance, you've just moved it from one place to another).
Note that you can infer the type of A from the function pointer, you just can't infer an instance to call your function on. If you want to call a static method, you don't need the class type at all:
template<typename Arg>
int call_on_static(int (*func)(Arg), Arg a)
{
func(a);
}