3 Stimmen

Aufrufen einer schablonenhaften Mitgliedsfunktion: Helfen Sie mir, einen Codeschnipsel aus einem anderen StackOverflow-Posting zu verstehen

In Bezug auf Können Zeiger auf Mitglieder die Zugriffsstufe eines Mitglieds umgehen? Ich würde gerne das Codeschnipsel in dieser Frage verstehen.

Ich füge das Codeschnipsel hier ein.

#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;
}

Neben einigen Fragen möchte ich hier eine einzige Frage hervorheben, die vielleicht den Rest aufdeckt.

Ich verstehe die folgende Aussage in der Studie nicht main Funktion:

a.*get(A_f())

I do verstehen (glaube ich), dass get(A_F()) gibt einen Zeiger auf a.a . Allerdings verstehe ich nicht die get() Funktion. In welcher Struktur ist sie tatsächlich definiert? Wie wird auf sie in dieser Struktur zugegriffen?

Ich habe zwei weitere Fragen, die beantwortet werden können, wenn die obige Frage beantwortet ist, aber ich werde sie hier stellen. Erstens, in der Definition von Rob die friend Schlüsselwort vor der Funktion verwendet wird get die sowohl definiert als auch deklariert wird. Ich dachte, dass die friend Schlüsselwort kann nur vor einer Funktion verwendet werden Erklärung um anzuzeigen, dass eine definierte Funktion anderswo Zugriff auf die privaten/geschützten Mitglieder der Klasse hat. Kann mir das jemand erklären?

Zweitens verstehe ich den Satz nicht template struct Rob<A_f, &A::a>; . Ich verstehe nicht die Verwendung des template Stichwort ohne <...> und ich verstehe nicht, warum es keine Vorlagendefinition gibt - dies scheint eine Art von Vorwärtserklärung zu sein. Kann mir das jemand erklären? Danke!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X