我刚问了一个关于访问STL适配器的底层容器的问题.我得到了一个非常有用的答案:
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;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法理解这一行:
return q.*&HackedQueue::c;
Run Code Online (Sandbox Code Playgroud)
这条线做什么?此外,该行怎么可以访问私有容器priority_queue传递给函数Container?
Ecl*_*pse 12
可以这样想:
(q).*(&HackedQueue::c);
Run Code Online (Sandbox Code Playgroud)
首先,你有HackedQueue :: c,它只是一个成员变量的名称.然后你拿&HackedQueue :: c,这是一个指向该成员变量的指针.接下来你拿q,这只是一个对象参考.然后使用"通过引用的成员绑定指针"运算符.*来绑定成员变量指针引用的成员变量q作为this.
至于私人会员问题,priority_queue::c只是受保护,而不是私人,因此当您从中获取时priority_queue,您可以访问其受保护的成员也就不足为奇了.
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |