我无法理解这一行 - 解除引用私有成员变量的地址或者什么?

时间:2009-09-09 16:59:54

标签: c++ stl

前一段时间我问了一个问题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的{​​{1}}中的私有容器?

1 个答案:

答案 0 :(得分:12)

这样想:

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

首先,你有HackedQueue :: c,它只是一个成员变量的名称。然后你拿&amp; HackedQueue :: c,这是一个指向该成员变量的指针。接下来,您将q,这只是一个对象引用。然后使用“引用成员的绑定指针”运算符.*,使用q作为this绑定成员变量指针引用的成员变量。

关于私人会员问题,priority_queue::c仅受保护,而非私密,因此当您从priority_queue派生时,您可以访问其受保护的成员也就不足为奇了。