#include <iostream>

template <typename C, typename T>
std::ptrdiff_t offsetof_impl(T C::* ptr) {
	C c; // only works for default constructible classes
	T* t = &(c.*ptr);
	return reinterpret_cast<char*>(&c) - reinterpret_cast<char*>(t);
}

template <typename C, typename T, T C::* Ptr>
std::ptrdiff_t offsetof() {
	static std::ptrdiff_t const Offset = offsetof_impl(Ptr);
	return Offset;
}

template <typename C, typename T, T C::* Ptr>
C& get_enclosing(T& t) {
	return *reinterpret_cast<C*>(reinterpret_cast<char*>(&t) + offsetof<C, T, Ptr>());
}

// Demo
struct E { int i; int j; };

int main() {
	E e = { 3, 4 };
	E& ref = get_enclosing<E, int, &E::j>(e.j);
	
	std::cout << (void const*)&e << " " << (void const*)&ref << "\n";
	return 0;
}