这种类型的模板参数是什么意思 - `ClassA<T> T::*ELEM`?
What is the meaning of template arguments of this type - `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.
..
..
};
我在 boost 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);
,那将帮助我理解它的用途。
这是一个成员指针。 NODE
是指向 T
类型为 Node<T>
的成员的指针。
类似地,foo->*bar
对于 (*foo).*bar
是 shorthand,其中 .*
是指向成员的取消引用指针运算符。 elem->*NODE
访问 *elem
中由 NODE
指向的成员。
那叫"pointer to member operator"。
标准(N3690,第 5.5 节)说:
成员指针运算符 ->* 和 .* 从左到右分组。
二元运算符 .* 将其第二个操作数(应为“指向 T 的成员的指针”类型)绑定到其第一个操作数,该操作数应为 class T 或 class其中 T 是一个明确且可访问的基数 class。
结果是第二个操作数指定类型的对象或函数。
二元运算符 ->* 将其第二个操作数(应为“指向 T 成员的指针”类型)绑定到其第一个操作数(应为“指向 T 的指针”或“指向 [= 的指针”类型) 28=] 其中 T 是明确且可访问的基数 class。”表达式 E1->*E2 转换为等效形式 (*(E1)).*E2.
另请参阅 http://en.cppreference.com/w/cpp/language/operator_member_access。
运算符 ::* 是相同的——使用 class 名称而不是变量进行访问,就像当您拥有 class C 和对象 obj 时,您可以执行 C::func 或 obj.func 或 (&obj)->func.
我最近在侵入式列表的上下文中看到这段代码:
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 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);
,那将帮助我理解它的用途。
这是一个成员指针。 NODE
是指向 T
类型为 Node<T>
的成员的指针。
类似地,foo->*bar
对于 (*foo).*bar
是 shorthand,其中 .*
是指向成员的取消引用指针运算符。 elem->*NODE
访问 *elem
中由 NODE
指向的成员。
那叫"pointer to member operator"。
标准(N3690,第 5.5 节)说:
成员指针运算符 ->* 和 .* 从左到右分组。
二元运算符 .* 将其第二个操作数(应为“指向 T 的成员的指针”类型)绑定到其第一个操作数,该操作数应为 class T 或 class其中 T 是一个明确且可访问的基数 class。 结果是第二个操作数指定类型的对象或函数。
二元运算符 ->* 将其第二个操作数(应为“指向 T 成员的指针”类型)绑定到其第一个操作数(应为“指向 T 的指针”或“指向 [= 的指针”类型) 28=] 其中 T 是明确且可访问的基数 class。”表达式 E1->*E2 转换为等效形式 (*(E1)).*E2.
另请参阅 http://en.cppreference.com/w/cpp/language/operator_member_access。
运算符 ::* 是相同的——使用 class 名称而不是变量进行访问,就像当您拥有 class C 和对象 obj 时,您可以执行 C::func 或 obj.func 或 (&obj)->func.