Я пытаюсь в качестве эксперимента реализовать безопасные навязчивые списки в 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; … };
, но вопрос все еще остается.