struct X
{
int data1, data2;
int X::*ptr;
X() : ptr(&X::data1) {}
};
int main()
{
X a; // now, `a.ptr` points to `a.data1`
X b = a; // `b.ptr` points to `b.data1`
a.ptr = &X::data2; // now `a.ptr` points to `a.data2`
// `b.ptr` points to `b.data1`
b = a; // `b.ptr` points to `b.data2` too
// Usage hint:
int deref = a.*(a.ptr); // gets the field pointed to by a.ptr, from the instance a
deref = b.*(b.ptr); // gets the field pointed to by b.ptr, from the instance b
// but of course you could get fancy and do
deref = a.*(b.ptr); // gets the field pointed to by b.ptr, **but** from the instance a
}
c3RydWN0IFgKewogICAgaW50IGRhdGExLCBkYXRhMjsKICAgIGludCBYOjoqcHRyOwoKICAgIFgoKSA6IHB0cigmWDo6ZGF0YTEpIHt9Cn07CgppbnQgbWFpbigpCnsKICAgIFggYTsgICAgICAvLyBub3csIGBhLnB0cmAgcG9pbnRzIHRvIGBhLmRhdGExYAogICAgWCBiID0gYTsgIC8vICAgICAgYGIucHRyYCBwb2ludHMgdG8gYGIuZGF0YTFgCgogICAgYS5wdHIgPSAmWDo6ZGF0YTI7ICAvLyBub3cgYGEucHRyYCBwb2ludHMgdG8gYGEuZGF0YTJgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBgYi5wdHJgIHBvaW50cyB0byBgYi5kYXRhMWAKICAgIGIgPSBhOyAgICAgICAgICAgICAgLy8gICAgIGBiLnB0cmAgcG9pbnRzIHRvIGBiLmRhdGEyYCB0b28KCiAgICAvLyBVc2FnZSBoaW50OgogICAgaW50IGRlcmVmID0gYS4qKGEucHRyKTsgLy8gZ2V0cyB0aGUgZmllbGQgcG9pbnRlZCB0byBieSBhLnB0ciwgZnJvbSB0aGUgaW5zdGFuY2UgYQogICAgICAgIGRlcmVmID0gYi4qKGIucHRyKTsgLy8gZ2V0cyB0aGUgZmllbGQgcG9pbnRlZCB0byBieSBiLnB0ciwgZnJvbSB0aGUgaW5zdGFuY2UgYgoKICAgIC8vIGJ1dCBvZiBjb3Vyc2UgeW91IGNvdWxkIGdldCBmYW5jeSBhbmQgZG8KICAgICAgICBkZXJlZiA9IGEuKihiLnB0cik7IC8vIGdldHMgdGhlIGZpZWxkIHBvaW50ZWQgdG8gYnkgYi5wdHIsICoqYnV0KiogZnJvbSB0aGUgaW5zdGFuY2UgYQp9