operator T () const {return a;}
Dies ist der Typcast-Operator . Es konvertiert die Klasseninstanz implizit in T
. In dem von Ihnen geposteten Beispielcode wird diese Konvertierung in der Zeile
int n = a;
Wenn Sie eine Instanz in ein T
konvertieren möchten, können Sie diesen Operator verwenden, der hier eine Kopie des privaten Members zurückgibt.
In Ihrem Beispielcode können Sie a
, das vom Typ A<int>
ist, direkt einem int
zuweisen. Versuchen Sie, operator T()
zu entfernen und sehen Sie, wie das Kompilieren fehlschlägt, wenn Sie A<T>
einem int
zuordnen.
Mit dem Konstruktor non explicit
(das Gegenteil des Kennzeichens eines Konstruktors explicit
) wird dieser Typ in einer Reihe von Fällen auch dem Schablonentyp selbst sehr ähnlich. In der Tat haben Sie eine T
in eine andere Klasse eingepackt, die sich bei Bedarf wie ein T
verhält. Sie könnten dies erweitern, um andere, nützlichere Dinge wie das Überwachen / Protokollieren / Beschränken der Verwendung von realen Instanzen zu tun, indem Sie sie hinter etwas verstecken, das sie kontrolliert.
Beachten Sie auch, dass Sie A<int> a = A<int>(5);
wegen des impliziten Konstruktors einfach in A<int> a = 5;
ändern können.
Es macht im Grunde einen Funktor - was ein Objekt mit Funktionssemantik ist. Das heißt, Sie können das Objekt genau wie eine Funktion als Ersatz an Stellen bezeichnen, an denen Sie möglicherweise eine Funktion verwendet haben - es ist ein generisches Programmierkonzept.
Es ist vorteilhaft, weil Sie mehrere Instanzen dieses Funktionsobjekts (Funktor) haben können und jeder seinen eigenen Zustand beibehalten kann, in dem Sie, wie wenn Sie eine Straight-Up-Funktion hätten, den Zustand nur über statische Variablen aufrechterhalten könnte wäre also nicht einspringend (man bekommt immer nur eine Instanz einer statischen Variable).
Funktoren werden in STL-Algorithmen als zusätzlicher optionaler Parameter stark verwendet.
Tags und Links c++ operator-overloading