这里我们有一个简单的节点结构,它可以用来实现一个双链表。
template <class T>
struct node {
node<T> *prev = NULL;
node<T> *next = NULL;
T data;
};
假设我们不知道或不引用节点对象/实例,但我们确实有一个指向它的数据成员的指针。T数据;
如何从指向它的数据成员的指针中引用/找到主机节点对象?
这里我们有一个简单的节点结构,它可以用来实现一个双链表。
template <class T>
struct node {
node<T> *prev = NULL;
node<T> *next = NULL;
T data;
};
假设我们不知道或不引用节点对象/实例,但我们确实有一个指向它的数据成员的指针。T数据;
如何从指向它的数据成员的指针中引用/找到主机节点对象?
详细说明 StenSoft 注释,如果您只知道成员的值,data
您将无法获取包含它的结构。
但是如果你知道它的地址,说T** member_addr
你可以找到node
:
void * ma = static_cast<void *>(member_addr); // convert pointer to void * : legal
intptr_t ima = static_cast<intptr_t>(ma); // convert void * to intptr_t : legal
intptr_t ina = ima - offsetof(struct node, data); // legal by definition of offestof
void * na = static_cast<void *>(ina); // convert intptr_t to void * : legal
struct node *pn = static_cast<node *>(na); // convert void * to pointer : legal provided the initial void * pointer points to a correct object
当然,所有这些都只适用于 C++11 或更高版本。