#include <iostream>
template <typename Type, typename ReturnType>
struct mem_fun_ptr_t
{
typedef ReturnType (Type::*Func)();
Func func;
public:
mem_fun_ptr_t(Func f):
func(f) {}
ReturnType operator () (Type *p) { return (p->*func)(); }
ReturnType operator () (Type *p) const { return (p->*func)(); }
};
template <typename T, typename R>
mem_fun_ptr_t<T, R> mem_fun_ptr(R (T::*Func)() const)
{
typedef R (T::*f)();
f x = reinterpret_cast<f>(Func);
return mem_fun_ptr_t<T, R>(x);
}
int main()
{
std::string str = "Hello";
auto x = mem_fun_ptr(&std::string::length);
std::cout << x(&str);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIHR5cGVuYW1lIFJldHVyblR5cGU+CnN0cnVjdCBtZW1fZnVuX3B0cl90CnsKICAgIHR5cGVkZWYgUmV0dXJuVHlwZSAoVHlwZTo6KkZ1bmMpKCk7CglGdW5jIGZ1bmM7CnB1YmxpYzoKCW1lbV9mdW5fcHRyX3QoRnVuYyBmKToKCQlmdW5jKGYpIHt9CglSZXR1cm5UeXBlIG9wZXJhdG9yICgpIChUeXBlICpwKSB7IHJldHVybiAocC0+KmZ1bmMpKCk7IH0KCVJldHVyblR5cGUgb3BlcmF0b3IgKCkgKFR5cGUgKnApIGNvbnN0IHsgcmV0dXJuIChwLT4qZnVuYykoKTsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFI+Cm1lbV9mdW5fcHRyX3Q8VCwgUj4gbWVtX2Z1bl9wdHIoUiAoVDo6KkZ1bmMpKCkgY29uc3QpCnsKCXR5cGVkZWYgUiAoVDo6KmYpKCk7CglmIHggPSByZWludGVycHJldF9jYXN0PGY+KEZ1bmMpOwoJcmV0dXJuIG1lbV9mdW5fcHRyX3Q8VCwgUj4oeCk7Cn0KCmludCBtYWluKCkKewoJc3RkOjpzdHJpbmcgc3RyID0gIkhlbGxvIjsKCWF1dG8geCA9IG1lbV9mdW5fcHRyKCZzdGQ6OnN0cmluZzo6bGVuZ3RoKTsKCXN0ZDo6Y291dCA8PCB4KCZzdHIpOwogICAgcmV0dXJuIDA7Cn0=