这种类型的模板参数是什么意思 - `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.