我最近在侵入列表的上下文中看到了这段代码:
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++方面的专家,但我以前从未见过这种特殊的语法,也不知道该搜索什么来理解它。
什么意思?它的目的是什么,我应该把它解释为“节点是一个指向节点的指针,属于T"?这对我来说没有意义,因为T不知道提前包含特定的成员,据我所知,::用于解析作用域。
此外,如果有人能够澄清*NODE在这一行中的用法,例如:Node<T> *node = &(elem->*NODE);,那将帮助我理解这是用于什么目的。
发布于 2016-10-26 20:33:45
是一个成员指针。NODE是指向具有Node<T>类型的T成员的指针。
类似地,foo->*bar是(*foo).*bar的简写,其中.*是取消引用指针到成员操作符.elem->*NODE访问NODE所指向的*elem成员。
发布于 2016-10-26 20:35:36
这叫做“指向成员操作符的指针”。
标准(N3690,第5.5节)规定:
指针对成员运算符->*和.*组从左到右.
二进制运算符.*将其第二个操作数绑定到其第一个操作数,其类型为“指向T成员的指针”,第一个操作数属于T类,或T是一个明确和可访问的基类。结果是第二个操作数指定的对象或函数。
二进制运算符->*将其第二个操作数绑定为“指向T的成员的指针”类型的第一个操作数,该操作数的类型为“指向T的指针”或“指向T是明确和可访问基类的类的指针”。表达式E1->*E2转换为等效形式(*(E1)).*E2。
还请看一下访问。
操作符::*是相同的--使用类名而不是变量访问,就像当您有类C和对象obj时,您可以执行C::func或obj.func或(&obj)->func。
https://stackoverflow.com/questions/40271361
复制相似问题