这种类型的模板参数的含义是什么 - “ClassA <t> T :: * ELEM`?

时间:2016-10-26 20:12:52

标签: c++ templates member-pointers intrusive-containers

我最近在侵入列表的上下文中遇到了这段代码:

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 librarymember_hook<class T, class Hook, Hook T::* PtrToMember>)中看到了类似的代码。

我的问题是关于模板参数Node<T> T::*NODE。我不是C ++方面的专家,但我以前从未遇到过这种特殊的语法,也不知道要搜索什么来理解它。

这是什么意思?它的目的是什么,我应该把它解释为 - &#34; NODE是指向节点的指针,属于T &#34;?这对我来说没有意义,因为T不知道提前包含特定成员,据我所知,::用于解决范围。

同样,如果有人可以澄清*NODE在这一行中的用法,例如:Node<T> *node = &(elem->*NODE);,那将有助于我理解这是用来做什么的。

2 个答案:

答案 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