C ++: Как найти хост-объект по указателю на переменную-член

Здесь мы имеем нашу простую структуру узла, которая может быть использоваться для реализации двойного связанного списка.

template <class T>
struct node {

node<T> *prev = NULL;
node<T> *next = NULL;
T data;
};

Предположим, что мы не знаем или не имеем ссылки на объект / экземпляр узла, но у нас есть указатель на данные член. Данные Т;

Как можно найти / найти объект узла узла по указателю на него? данные член?

-1

Решение

Разработка комментариев 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 или выше.

1

Другие решения


По вопросам рекламы [email protected]