After a decent amount of research ...
This is actually done in most industrial intrusive implementations. However, this requires some hacking.
Strengthening intrusive structures uses the following (and yes, this is a specific implementation)
template<class Parent, class Member> inline const Parent *parent_from_member(const Member *member, const Member Parent::* ptr_to_member) { return (const Parent*)((const char*)member - offset_from_pointer_to_member(ptr_to_member)); } template<class Parent, class Member> inline std::ptrdiff_t offset_from_pointer_to_member(const Member Parent::* ptr_to_member) {
Essentially the same thing (albeit in C), as is done in the linux kernel for managing intrusive lists, with the container_of macro (but, of course, ptr-to-members are not used):
#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );})
bcr
source share