fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct A {unsigned char _data;};
  5. struct B {unsigned char _data;};
  6. struct C {A a; B b;};
  7.  
  8. C& get_parent(A& ar)
  9. {
  10. return *reinterpret_cast<C*>(reinterpret_cast<char*>(&ar) - offsetof(C, a));
  11. }
  12.  
  13. B& get_sister(A& ar)
  14. {
  15. return get_parent(ar).b;
  16. }
  17.  
  18. int main() {
  19. C c;
  20. cout << "&c = " << &c << endl;
  21. cout << "&c.a = " << &(c.a) << endl;
  22. cout << "&c.b = " << &(c.b) << endl;
  23.  
  24. A& ar = c.a;
  25. cout << "&ar = " << &ar << endl;
  26.  
  27. B& br = get_sister(ar);
  28. cout << "&br = " << &br << endl;
  29.  
  30. C& cr = get_parent(ar);
  31. cout << "&cr = " << &cr << endl;
  32.  
  33. return 0;
  34. }
Success #stdin #stdout 0.01s 5548KB
stdin
Standard input is empty
stdout
&c = 0x7ffc1e725bf6
&c.a = 0x7ffc1e725bf6
&c.b = 0x7ffc1e725bf7
&ar = 0x7ffc1e725bf6
&br = 0x7ffc1e725bf7
&cr = 0x7ffc1e725bf6