Sau một số lượng nghiên cứu phong nha ...
Điều này thực sự được thực hiện trong hầu hết các triển khai danh sách xâm nhập công nghiệp. Nó đòi hỏi một số hackery, tuy nhiên.
Boost cấu trúc xâm nhập sử dụng sau đây (và có, nó là thực hiện cụ thể)
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)
{
//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*)&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<const char*>(&(parent->*ptr_to_member));
return std::ptrdiff_t(member - reinterpret_cast<const char*>(parent));
#else
//This is the traditional C-front approach: __MWERKS__, __DMC__, __SUNPRO_CC
return (*(const std::ptrdiff_t*)(void*)&ptr_to_member) - 1;
#endif
}
Về cơ bản điều tương tự (mặc dù trong C) như được thực hiện trong kernel linux để quản lý danh sách xâm nhập, với container_of macro (nhưng tất nhiên ptr-to-thành viên không được sử dụng):
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr);
(type *)((char *)__mptr - offsetof(type,member));})
Bạn có thể rõ ràng hơn không. Tôi không hiểu bạn muốn làm gì. Lấy làm tiếc. – Mahesh