fork download
  1. #include <iostream>
  2.  
  3. template <typename C, typename T>
  4. std::ptrdiff_t offsetof_impl(T C::* ptr) {
  5. C c; // only works for default constructible classes
  6. T* t = &(c.*ptr);
  7. return reinterpret_cast<char*>(&c) - reinterpret_cast<char*>(t);
  8. }
  9.  
  10. template <typename C, typename T, T C::* Ptr>
  11. std::ptrdiff_t offsetof() {
  12. static std::ptrdiff_t const Offset = offsetof_impl(Ptr);
  13. return Offset;
  14. }
  15.  
  16. template <typename C, typename T, T C::* Ptr>
  17. C& get_enclosing(T& t) {
  18. return *reinterpret_cast<C*>(reinterpret_cast<char*>(&t) + offsetof<C, T, Ptr>());
  19. }
  20.  
  21. // Demo
  22. struct E { int i; int j; };
  23.  
  24. int main() {
  25. E e = { 3, 4 };
  26. E& ref = get_enclosing<E, int, &E::j>(e.j);
  27.  
  28. std::cout << (void const*)&e << " " << (void const*)&ref << "\n";
  29. return 0;
  30. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
0xbfd21bd8 0xbfd21bd8