C++ Grundkurs

Vollständige Spezialisierung durchführen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
C++ gibt bei der vollständigen Spezialisierung eines Template sämtliche Template-Parameter durch Template-Argumente vor.
04:11

Transkript

In dieser Lektion werde ich auf die vollständige Spezialisierung von Templates eingehen. Bei einer vollständigen Spezialisierung eines Templates sind alle Template-Parameter durch Template-Argumente vorgegeben. Die Liste der Template-Parameter ist auf eine leere Liste reduziert, während die Template-Argumente auf den Namen des Templates folgen. Hier ein kleines Beispiel für ein Klassen-Template. Hier das allgemeine primäre Klassen-Template und hier das vollständig spezialisierte. Sie sehen, hier habe ich die leere Liste von Template-Parametern und die hier die vollständige Liste von Template-Argumenten. Wenn Sie das genau anschauen, ist das ein ganz kleiner Ansatz von dem System von Type-Inspektion. Wenn ich einen unbekannten Typ reingebe, dann wird der durch dieses Klassen-Template hier angenommen und als Ergebnis bekomme ich die Aussage unknown. Wenn ich die den Account-Typ aufrufe auf Typ, bekomme ich als Ergebnis die Aussage Account. Das werde ich Ihnen gleich im Beispiel deutlich zeigen. Noch eine Besonderheit zur vollständigen Spezialisierung. Werden die Methoden eines vollständig spezialisierten Klassen-Templates außerhalb der Klasse definiert, darf die leere Liste der Template-Parameter nicht angegeben werden. Meine Matrix hier ist vollständig spezialisiert. Template-Parameter habe ich keinen mehr, nur noch Template-Argumente. Wird nun diese Methode außerhalb der Klasse definiert, darf die leere Liste der Template-Parameter nicht angegeben werden. Genau das, was ich hier auskommentiert habe, darf nicht angegeben werden. Wird es angegeben, ist es ein Syntaxerror. Das erwähne ich so explizit, weil ich selber darauf vor kurzem wieder reingefallen bin. Intuitiv würde ich hier immer Template mit leeren eckigen Klammern verwenden wollen. Nun zum Beispiel. Hier diesmal der Account mit leerem Funktionskörper. Dann definiere ich hier ein primäres Template Type und was ich hier entwickeln will, ist ein ganz einfaches System von Introspektion. Das heißt, ich rufe Typ mit einem gewissen Typ auf und als Ergebnis bekomme ich entweder unknown zurück, wenn der Typ nicht bekannt ist oder ich bekomme einen String zurück, der den Typ repräsentiert. Ich fange einmal oben an. Das primäre Klassen-Template Type gibt als Ergebnis unknown zurück. Das heißt, die Methode getName gibt unknown zurück. Wenn ich dieses Template Type immer int aufrufe, also die vollständige Spezialisierung von int verwenden, dann gibt es natürlich die Antwort int. Für double gibt es double, für string gibt es string und Sie wissen den Rest. FürAccount gibt es Account und das war es schon. Auf das gehe ich dann gleich noch einmal weiter ein. Jetzt probiere ich das aus. Jetzt habe ich hier einen Typ Type Float tFloat und von dem kann ich jetzt die Namensrepräsentation abfragen. Ich lasse das Programm einmal laufen und Sie sehen, für Float bzw. tFloat bekomme ich getName(): unknown. Wieso bekomme ich unknown? Weil ich keine Spezialisierung für Float habe. Ich habe nur einen für Double. Also der Typ ist meinem Typsystem nicht bekannt, also bekomme ich das Ergebnis unknown. Ganz anders verhält es sich bei Double, String, Int und Account. Da bekomme ich jeweils double, string, int und Account als Ergebnis. Da das ein bisschen mühsam ist, habe das ein bisschen gerappt. Ich habe hier ein kleines Funktions-Template geschrieben, das einen Typ annimmt implizit Type von T, von diesem T hier instanziiert und dann getName aufruft. Wie kann ich das verwenden? Ich habe hier ein unknownType, den ich durch automatische Typ-Deduktion aus C++ erhalte und der andere Typ ist ein Typ, der sich aus der Addition von 2011 und 3.14 ergibt. Ich habe keine Ahnung, von welchem Typ unknownType ist. Was mache ich? Ich rufe das Funktions-Template getType auf mit meinem unknownType und bekomme als Ergebnis raus, das ist ein double. Das habe ich natürlich davor schon gewusst. Aber Sie sehen, so einfach lässt sich ein Introspektionssystem in C++ entwickeln. Natürlich ist es ein bisschen Schreibarbeit. Das Einzige, was ich benötige, ist allgemeines Template, vollständig spezialisierte Templates und einen kleinen Wrapper drumrum, damit es ein bisschen gemütlicher wird. In dieser Lektion habe ich Ihnen die vollständige Spezialisierung von Templates vorgestellt. Bei der vollständigen Spezialisierung von Templates sind alle Template-Parameter durch Template-Argumente vorgegeben.

C++ Grundkurs

Steigen Sie in die mächtige Programmiersprache C++ ein und lernen Sie dabei alle wichtigen Funktionen mit Anwendungsbeispielen kennen.

8 Std. 14 min (147 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!