代码之家  ›  专栏  ›  技术社区  ›  Khaled Alshaya

我不能理解这一行-取消引用私有成员变量的地址或什么?

  •  7
  • Khaled Alshaya  · 技术社区  · 16 年前

    我刚才问了一个问题 about accessing the underlying container of STL adapters . 我得到了一个非常有用的答案:

    template <class T, class S, class C>
        S& Container(priority_queue<T, S, C>& q) {
            struct HackedQueue : private priority_queue<T, S, C> {
                static S& Container(priority_queue<T, S, C>& q) {
                    return q.*&HackedQueue::c;
                }
            };
        return HackedQueue::Container(q);
    }
    
    int main()
    {
        priority_queue<SomeClass> pq;
        vector<SomeClass> &tasks = Container(pq);
        return 0;
    }
    

    不幸的是,我无法理解这句话:

    return q.*&HackedQueue::c;
    

    这条线是干什么的?另外,那条线如何访问 priority_queue 传递给函数的 Container ?

    1 回复  |  直到 16 年前
        1
  •  12
  •   Khaled Alshaya    16 年前

    这样想:

    (q).*(&HackedQueue::c);
    

    首先,您有hackedQueue::c,它只是一个成员变量的名称。然后取&hackedQueue::c,它是指向该成员变量的指针。下一个 q ,这只是一个对象引用。然后使用“通过引用将指针绑定到成员”运算符 .* 要绑定成员变量指针引用的成员变量,请使用 作为 this .

    关于私人成员问题, priority_queue::c 只有被保护,而不是私人的,所以当你从 priority_queue ,您可以访问其受保护的成员。