我最近在侵入性列表的上下文中遇到了这段代码:
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.
..
..
};
我在 boost侵入式列表库( member_hook<class T, class Hook, Hook T::* PtrToMember>
)中看到了类似的代码。
我的问题是关于模板参数Node<T> T::*NODE
。我不是 C++ 方面的专家,但我以前从未遇到过这种特殊的语法,也不知道要搜索什么来理解它。
这是什么意思?它的目的是什么,我应该将其解释为 - “ NODE 是指向节点的指针,属于 T ”?这对我来说没有意义,因为不知道 T 提前包含特定成员,据我所知,::
它用于解析范围。
同样,如果有人可以澄清*NODE
这一行中的用法,例如 : Node<T> *node = &(elem->*NODE);
,那将有助于我理解它的用途。