Здесь мы имеем нашу простую структуру узла, которая может быть использоваться для реализации двойного связанного списка.
template <class T>
struct node {
node<T> *prev = NULL;
node<T> *next = NULL;
T data;
};
Предположим, что мы не знаем или не имеем ссылки на объект / экземпляр узла, но у нас есть указатель на данные член. Данные Т;
Как можно найти / найти объект узла узла по указателю на него? данные член?
Разработка комментариев 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 или выше.