я наткнулся на этот код в последнее время, в контексте интрузивных списков:В чем смысл аргументов шаблона этого типа - `ClassA <T> T :: * ELEM`?
template<typename T> struct Node{
T *next;
T *prev;
Node(): next(nullptr), prev(nullptr){}
};
/*
* Intrusive doubly-linked-list
*
* */
template<typename T, Node<T> T::*NODE>
class List{
T *head;
T *tail;
public:
List():head(nullptr), tail(nullptr){}
~List() {clear();}
/*
* Add an element at the head of list
* @param elem item to be inserted
* */
void add_to_front(T *elem){
Node<T> *node = &(elem->*NODE);
assert((node->next) == nullptr);
assert((node->prev) == nullptr);
node->next = head;
if(head != nullptr){
Node<T> *temp = &(head->*NODE);
temp->prev = elem;
}
head = elem;
if(tail == nullptr)
tail = head;
}
//other member functions ,etc.
..
..
};
Я вижу подобный код в форсирования intrusive list library (member_hook<class T, class Hook, Hook T::* PtrToMember>
).
Мой вопрос касается шаблона аргумента Node<T> T::*NODE
. Я не эксперт в C++, но я никогда не сталкивался с этим конкретным синтаксисом раньше и не знаю, что искать, чтобы понять его.
Что это значит? Какова его цель и что я должен ее интерпретировать как «NODE является указателем на узел, принадлежащий T»? Это не имеет смысла для меня, потому что T, как известно, не содержит конкретных членов раньше времени, и, насколько я знаю, для разрешения области используется ::
.
Кроме того, если кто-то может уточнить использование *NODE
в этой строке, например: Node<T> *node = &(elem->*NODE);
, это поможет мне понять, для чего это используется.
Ожидается ли, что T будет иметь тип Node? –
aspen100
@ aspen100 Да, это интрузивный бит. Чтобы использовать его как элемент «List',' T' должен содержать элемент «Node». Местоположение этого элемента указывается указателем члена NODE. –
melpomene