#include <iostream>
#include <utility>
using namespace std;
template<typename T, typename M, M Method>
class ProxyObject
{
public:
template<typename... Args>
void Invoke (T& Object, Args&&... A)
{
(void)(Object.*Method)(std::forward<Args>(A)...);
}
};
class Object
{
public:
int MyMethod (int Val)
{
cout << "Hello!" << endl;
return Val;
}
};
template<typename T, typename M, typename... Args>
void invoke (T& Object, M Method, Args&&... A)
{
(void)(Object.*Method)(std::forward<Args>(A)...);
}
int main ()
{
Object myObj;
ProxyObject<Object, decltype(&Object::MyMethod), &Object::MyMethod> obj;
obj.Invoke(myObj, 10);
invoke(myObj, &Object::MyMethod, 10);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0sIE0gTWV0aG9kPgpjbGFzcyBQcm94eU9iamVjdAp7CnB1YmxpYzoKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgogICAgdm9pZCBJbnZva2UgKFQmIE9iamVjdCwgQXJncyYmLi4uIEEpCiAgICB7CiAgICAgICAgKHZvaWQpKE9iamVjdC4qTWV0aG9kKShzdGQ6OmZvcndhcmQ8QXJncz4oQSkuLi4pOwogICAgfQp9OwoKY2xhc3MgT2JqZWN0CnsKcHVibGljOgoKICAgIGludCBNeU1ldGhvZCAoaW50IFZhbCkKICAgIHsKICAgICAgICBjb3V0IDw8ICJIZWxsbyEiIDw8IGVuZGw7CiAgICAgICAgcmV0dXJuIFZhbDsKICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE0sIHR5cGVuYW1lLi4uIEFyZ3M+CnZvaWQgaW52b2tlIChUJiBPYmplY3QsIE0gTWV0aG9kLCBBcmdzJiYuLi4gQSkKewogICAgKHZvaWQpKE9iamVjdC4qTWV0aG9kKShzdGQ6OmZvcndhcmQ8QXJncz4oQSkuLi4pOwp9CgppbnQgbWFpbiAoKQp7CiAgICBPYmplY3QgbXlPYmo7CiAgICBQcm94eU9iamVjdDxPYmplY3QsIGRlY2x0eXBlKCZPYmplY3Q6Ok15TWV0aG9kKSwgJk9iamVjdDo6TXlNZXRob2Q+IG9iajsKCiAgICBvYmouSW52b2tlKG15T2JqLCAxMCk7CiAgICAKICAgIGludm9rZShteU9iaiwgJk9iamVjdDo6TXlNZXRob2QsIDEwKTsKCiAgICByZXR1cm4gMDsKfQ==