Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>After a decent amount of research...</p> <p>This is actually done in most industrial intrusive list implementations. It does require some hackery, however.</p> <p>Boost intrusive structures use the following (and yes, it is implementation specific)</p> <pre><code>template&lt;class Parent, class Member&gt; 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&lt;class Parent, class Member&gt; inline std::ptrdiff_t offset_from_pointer_to_member(const Member Parent::* ptr_to_member) { //The implementation of a pointer to member is compiler dependent. #if defined(BOOST_INTRUSIVE_MSVC_COMPLIANT_PTR_TO_MEMBER) //msvc compliant compilers use their the first 32 bits as offset (even in 64 bit mode) return *(const boost::int32_t*)(void*)&amp;ptr_to_member; //This works with gcc, msvc, ac++, ibmcpp #elif defined(__GNUC__) || defined(__HP_aCC) || defined(BOOST_INTEL) || \ defined(__IBMCPP__) || defined(__DECCXX) const Parent * const parent = 0; const char *const member = reinterpret_cast&lt;const char*&gt;(&amp;(parent-&gt;*ptr_to_member)); return std::ptrdiff_t(member - reinterpret_cast&lt;const char*&gt;(parent)); #else //This is the traditional C-front approach: __MWERKS__, __DMC__, __SUNPRO_CC return (*(const std::ptrdiff_t*)(void*)&amp;ptr_to_member) - 1; #endif } </code></pre> <p>Essentially the same thing (albeit in C) as is done in the linux kernel to manage intrusive lists, with the container_of macro (but of course ptr-to-members are not used):</p> <pre><code>#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)-&gt;member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );}) </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload