前一段时间我问了一个问题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}}中的私有容器?
答案 0 :(得分:12)
这样想:
(q).*(&HackedQueue::c);
首先,你有HackedQueue :: c,它只是一个成员变量的名称。然后你拿&amp; HackedQueue :: c,这是一个指向该成员变量的指针。接下来,您将q
,这只是一个对象引用。然后使用“引用成员的绑定指针”运算符.*
,使用q
作为this
绑定成员变量指针引用的成员变量。
关于私人会员问题,priority_queue::c
仅受保护,而非私密,因此当您从priority_queue
派生时,您可以访问其受保护的成员也就不足为奇了。