我最近在侵入列表的上下文中遇到了这段代码:
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 ++方面的专家,但我以前从未遇到过这种特殊的语法,也不知道要搜索什么来理解它。
这是什么意思?它的目的是什么,我应该把它解释为 - &#34; NODE是指向节点的指针,属于T &#34;?这对我来说没有意义,因为T不知道提前包含特定成员,据我所知,::
用于解决范围。
同样,如果有人可以澄清*NODE
在这一行中的用法,例如:Node<T> *node = &(elem->*NODE);
,那将有助于我理解这是用来做什么的。
答案 0 :(得分:3)
它是一个成员指针。 NODE
是指向T
成员Node<T>
的成员的指针。
同样,foo->*bar
是(*foo).*bar
的简写,其中.*
是取消引用指针到成员的运算符。 elem->*NODE
访问*elem
指向的NODE
成员。
答案 1 :(得分:1)
这称为&#34;指向成员运营商&#34;。
的指针标准(N3690,第5.5节)说:
指向成员的操作符 - &gt; *和。*组从左到右。
二元运算符。*将其第二个操作数绑定到第一个操作数,该操作数应为“指向T成员的指针”类型,该操作数应为T类或T类是明确且可访问的基类的类。 结果是第二个操作数指定的类型的对象或函数。
二元运算符 - &gt; *将其第二个操作数绑定到第一个操作数,该操作数应为“指向T成员的指针”类型,该操作数应为“指向T的指针”或“指向其中一类的指针” T是一个明确且可访问的基类。“表达式E1-> * E2被转换为等价形式(*(E1))。* E2。
另请查看http://en.cppreference.com/w/cpp/language/operator_member_access。
operator :: *是相同的 - 使用类名而不是变量访问,就像你有C类和对象obj一样,你可以做C :: func或obj.func或(&amp; obj) - &GT; FUNC