template <typename Ret, typename T, Ret(T::*mptr)()>
Ret f() { 
  T obj; 
  return (obj.*mptr)(); 
}

template <typename Ret, typename T>
Ret g(Ret(T::*mptr)())
{
    return f<Ret,T,mptr>();
}

struct A {
    int a() { return 0; }
};

int main() {
    return g(&A::a);
}