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);
}
dGVtcGxhdGUgPHR5cGVuYW1lIFJldCwgdHlwZW5hbWUgVCwgUmV0KFQ6OiptcHRyKSgpPgpSZXQgZigpIHsgCiAgVCBvYmo7IAogIHJldHVybiAob2JqLiptcHRyKSgpOyAKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFJldCwgdHlwZW5hbWUgVD4KUmV0IGcoUmV0KFQ6OiptcHRyKSgpKQp7CiAgICByZXR1cm4gZjxSZXQsVCxtcHRyPigpOwp9CgpzdHJ1Y3QgQSB7CiAgICBpbnQgYSgpIHsgcmV0dXJuIDA7IH0KfTsKCmludCBtYWluKCkgewogICAgcmV0dXJuIGcoJkE6OmEpOwp9