首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这种类型的模板参数的含义是什么- `ClassA<T> T::*ELEM` `?

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

Stack Overflow用户
提问于 2016-10-26 20:12:51
回答 2查看 128关注 0票数 1

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

代码语言:javascript
复制
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);,那将帮助我理解这是用于什么目的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-26 20:33:45

是一个成员指针。NODE是指向具有Node<T>类型的T成员的指针。

类似地,foo->*bar(*foo).*bar的简写,其中.*是取消引用指针到成员操作符.elem->*NODE访问NODE所指向的*elem成员。

票数 3
EN

Stack Overflow用户

发布于 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40271361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档