#include <iostream>
template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
using namespace std;
class Point
{
public:
Point( void ) : m_i(0) {}
void PrintPrivate( void ){cout << m_i << endl; }
private:
int m_i;
};
struct Point_f {
typedef int Point::*type;
friend type get(Point_f);
};
template struct Rob<Point_f, &Point::m_i>;
void ChangePrivate ( Point &i )
{
i.*get(Point_f()) = 4;
}
int main()
{
Point sPoint;
sPoint.PrintPrivate();
ChangePrivate(sPoint);
sPoint.PrintPrivate();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVGFnLCB0eXBlbmFtZSBUYWc6OnR5cGUgTT4Kc3RydWN0IFJvYiB7IAogIGZyaWVuZCB0eXBlbmFtZSBUYWc6OnR5cGUgZ2V0KFRhZykgewogICAgcmV0dXJuIE07CiAgfQp9OwoKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNsYXNzIFBvaW50CnsKcHVibGljOgogICAgUG9pbnQoIHZvaWQgKSA6IG1faSgwKSB7fQogICAgdm9pZCBQcmludFByaXZhdGUoIHZvaWQgKXtjb3V0IDw8IG1faSA8PCBlbmRsOyB9CnByaXZhdGU6CiAgICBpbnQgbV9pOwp9OwoKc3RydWN0IFBvaW50X2YgeyAKICB0eXBlZGVmIGludCBQb2ludDo6KnR5cGU7CiAgZnJpZW5kIHR5cGUgZ2V0KFBvaW50X2YpOwp9Owp0ZW1wbGF0ZSBzdHJ1Y3QgUm9iPFBvaW50X2YsICZQb2ludDo6bV9pPjsKCnZvaWQgQ2hhbmdlUHJpdmF0ZSAoIFBvaW50ICZpICkgCnsgIAogICAgaS4qZ2V0KFBvaW50X2YoKSkgPSA0Owp9CgppbnQgbWFpbigpCnsKICAgICBQb2ludCBzUG9pbnQ7CiAgICAgc1BvaW50LlByaW50UHJpdmF0ZSgpOwogICAgIENoYW5nZVByaXZhdGUoc1BvaW50KTsKICAgICBzUG9pbnQuUHJpbnRQcml2YXRlKCk7Cn0=