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

Ara*_*raK 7 c++ stl

我刚问了一个关于访问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,您可以访问其受保护的成员也就不足为奇了.

  • `&(HackedQueue :: c)`实际上会尝试获取指向成员变量的指针,并且因为c不是静态成员而失败.常见的陷阱:)在&和成员名称之间不能是除了空格之外的任何东西.例如:`struct A {int a; }; 结构B:A {void f(){*&(A :: a)= 0; 这 - >*&A :: a = 0; `注意区别:`&(A :: a)`得到实际成员对象的int*(如果a在派生类中被同名名称隐藏,它有时很有用),而`(&A ::) a)`获取存储成员偏移量的成员指针.无论如何,我明白它可能不是真正的代码:) (4认同)