В отношении Может ли указатель на члены обойти уровень доступа участника? , я хотел бы понять фрагмент кода в этом вопросе.
Я вставлю фрагмент кода здесь.
#include <iostream>
template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
// use
struct A {
A(int a):a(a) { }
private:
int a;
};
// tag used to access A::a
struct A_f {
typedef int A::*type;
friend type get(A_f);
};
template struct Rob<A_f, &A::a>;
int main() {
A a(42);
std::cout << "proof: " << a.*get(A_f()) << std::endl;
}
Из нескольких вопросов я выделяю здесь один вопрос, который может расколоть остальные.
Я не понимаю следующее утверждение в функции main
:
a.*get(A_f())
Я делаю понимаю (я думаю), что get(A_F())
возвращает указатель на a.a
.Однако я не понимаю функцию get()
.В какой структуре это определено?Как к нему обращаются в этой структуре?
У меня есть два второстепенных вопроса, на которые можно ответить, если ответ на вышеупомянутый вопрос, но я помещу их здесь.Во-первых, в определении Rob
ключевое слово friend
используется перед определяемой и объявленной функцией get
.Я думал, что ключевое слово friend
можно использовать только перед объявлением объявления , чтобы указать, что функция, определенная в другом месте , имеет доступ к закрытым / защищенным членам класса.Может кто-нибудь объяснить?
Во-вторых, я не понимаю строки template struct Rob<A_f, &A::a>;
.Я не понимаю использование ключевого слова template
без <...>
, и я не понимаю, почему нет определения шаблона - это, кажется, своего рода предварительное объявление.Может кто-нибудь объяснить?Спасибо.