Вызов шаблонной функции-члена: помогите мне понять фрагмент кода из другой публикации StackOverflow - PullRequest
3 голосов
/ 28 марта 2012

В отношении Может ли указатель на члены обойти уровень доступа участника? , я хотел бы понять фрагмент кода в этом вопросе.

Я вставлю фрагмент кода здесь.

#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 без <...>, и я не понимаю, почему нет определения шаблона - это, кажется, своего рода предварительное объявление.Может кто-нибудь объяснить?Спасибо.

1 Ответ

2 голосов
/ 28 марта 2012

Однако я не понимаю функцию get().В какой структуре это определено?Как к нему обращаются в этой структуре?

Первым делом: функция get() является другом шаблонов классов A и Rob.Это не функция-член любого класса.Это скорее бесплатная функция.

Теперь, где именно определена эта бесплатная функция?Ну, это определено в Rob шаблоне класса, и в то же время оно объявлено как friend из Rob шаблона класса.

Я думал, что другКлючевое слово может использоваться только перед объявлением функции, чтобы указать, что функция, определенная в другом месте, имеет доступ к закрытым / защищенным членам класса.Может кто-нибудь объяснить?

Да, он может быть объявлен friend класса, не определяя его внутри класса.Он может также быть определенным внутри класса и в то же время может быть объявлен friend этого класса.В вашем случае он фактически определен в самом классе.

Во-вторых, я не понимаю строку template struct Rob<A_f, &A::a>;.

Это называется явнымсоздание шаблона класса с заданными аргументами tempate.Вы можете увидеть много других синтаксисов для явного создания экземпляра шаблона здесь (хорошо, если это шаблон функции ):

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