C++:如何从指向成员变量的指针中找到宿主对象

C++: How to find host object from pointer to member variable

本文关键字:指针 对象 宿主 变量 成员 C++      更新时间:2023-10-16

这里我们有一个简单的节点结构,可以用于实现双链表。

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或更高版本。