Я не могу понять эту строку - разыменование адреса частной переменной-члена или что? - PullRequest
7 голосов
/ 09 сентября 2009

Я недавно задал вопрос о доступе к базовому контейнеру адаптеров 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;
}

К сожалению, я не мог понять эту строку:

return q.*&HackedQueue::c;

Что делает эта строка? Кроме того, как эта строка может получить доступ к закрытому контейнеру в priority_queue, который передается в функцию Container?

1 Ответ

12 голосов
/ 09 сентября 2009

Думайте об этом так:

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

Во-первых, у вас есть HackedQueue :: c, который является просто именем переменной-члена.Затем вы берете & HackedQueue :: c, который является указателем на эту переменную-член.Далее вы берете q, который является просто ссылкой на объект.Затем вы используете оператор «связать указатель на элемент по ссылке» .*, чтобы связать переменную-член, на которую указывает указатель на переменную-член, используя q в качестве this.

Что касается закрытого членавопрос, priority_queue::c только защищенный, а не частный, поэтому неудивительно, что когда вы наследуете priority_queue, вы можете получить доступ к его защищенным элементам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...