Указатель поля члена C ++: container_of - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь в качестве эксперимента реализовать безопасные навязчивые списки в C ++.Поскольку решения на основе offsetof ограничены классами POD, я пытаюсь найти указатели на поля-члены:

class intrusive_node { intrusive_node *node; … };
class data {
  intrusive_node node;
}

intrusive_node data::*node_offset = &data::node;

Эти указатели позволяют иметь указатель на поле доступа к экземпляру:

data &reference;
reference.*node_offset // intrusive_node &

Это относится к добавлению offsetof из C.

Однако я не нашел способа «прыгнуть» назад : из member to instance .Обычно это делается в C с помощью макроса container_of, который вычитает offsetof.Тем не менее, я не нашел способа достичь этого в C ++: я никогда не видел пример, и указатели членов не могут быть преобразованы в целочисленные представления.

В настоящее время мне удалось создать навязчивый список, но навязчивыйузел ссылается на весь целевой объект, а не на его узел:

template<typename Host>
class intrusive_node { Host *next; … };

, но вопрос все еще остается.

...