gpt4 book ai didi

c++ - 从指向成员的指针中恢复父级

转载 作者:可可西里 更新时间:2023-11-01 18:28:45 25 4
gpt4 key购买 nike

假设我们有一个指向类成员的指针指向类的一个字段。我们还有一个指向类的特定实例中的特定字段的指针。例如,我们可能有这样的东西:

class A {
B inner_object;
}

A* myA = /* ... */
B* ptr = &myA->inner_object;
B A::* memPtr = &A::inner_object;

有没有办法使用ptrmemPtr来恢复myA?也就是说,如果我们还没有一个指向 myA 的显式指针,我们可以从 ptrmemPtr 中创建一个吗?

最佳答案

经过大量研究...

这实际上是在大多数工业侵入式列表实现中完成的。然而,它确实需要一些技巧。

Boost 侵入式结构使用以下内容(是的,它是特定于实现的)

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
}

本质上与在 linux 内核中使用 container_of 宏管理侵入式列表(但当然不使用 ptr-to-members)所做的事情相同(尽管是在 C 中):

#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})

关于c++ - 从指向成员的指针中恢复父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6867559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com