Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C++ Grundkurs

Partielle Spezialisierung durchführen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die Durchführung einer partiellen Spezialisierung schränkt die zur Verfügung stehenden Parameter ein. Diese Funktion wird in C++ ausschließlich von Klassen-Templates unterstützt.
07:29

Transkript

In dieser Lektion möchte ich Ihnen die partielle Spezialisierung von Templates vorstellen. Die partielle Spezialisierung eines Templates wird nur für Klassen-Templates unterstützt. Besitzt sowohl Template-Argumente also auch Template-Parameter. Auf beide Begriffe gehe ich gleich weiter ein. Zuerst aber wieder das primäre Template. Das ist das primäre Template class Matrix. In diesem Fall besitzt es auch eine Definition. Das sind die geschweiften Klammern hier. Das primäre Template zeichnet sich dadurch aus, dass es drei Template-Parameter besitzt. Typen T, Line und Column. T ist vom Typ Typ. Line ist vom Typ Nicht-Typ und Column ist vom Typ Nicht-Typ. Nur zur ersten partiellen Spezialisierung. Die erste partielle Spezialisierung ist dadurch eingeschränkt, dass ich das erste Template-Argument noch freilasse, das zweite und dritte hingegen auf 3 setze. Hier sehen Sie auch den Unterschied zwischen Template-Parameter und Template-Argument. Template-Parameter ist alles, was in der ersten Zeile steht. Template-Argument alles, was in der zweiten Zeile steht. T ist ein Template-Parameter und hier sind T, 3 und 3 die Template-Argumente. Nun zur letzten partiellen Template-Spezialisierung. In diesem Fall sind die Template-Parameter Line und Column und die Argumente double, Line und Column. Nun instanziiere ich noch zwei Templates. Das erste mit den Argumenten int, 3 und 3. Das führt dazu, dass die erste partielle Spezialisierung hier oben genommen wird, weil 3 und 3 natürlich der 3 und der 3 hier entspricht und int der Match für das T hier darstellt. Wenn ich hingegen double, 10, 10 verwende, wird die partielle Spezialisierung hier verwendet. Da double auf double hier passt und 10 und 10 jeweils für Line und Column Argumente sein können. Nun gibt es zur partiellen Spezialisierung noch ein paar Regeln im Kopf zu behalten. Die zeige ich Ihnen jetzt. Ich werde Ihnen die Regeln erst mal als Satz präsentieren und dann werde ich sie an diesem kleinen Beispiel hier oben erläutern. Der Compiler wendet die partielle Spezialisierung an, wenn die Template-Argumente der instanziierten Klasse eine Teilmenge der Liste der Template-Argumente sind. Das heißt, wenn die Template-Argumente der instanziierten Klasse, das ist das int, das 3 und 3, eine Teilmenge der Template-Argumente sind. Das ist der Fall. 3 ist 3. Das sind exakte Matches und int ist eine Teilmenge von T. Die unspezifizierten Template-Argumente müssen als Template-Parameter angegeben werden. Was sind die unspezifizierten Template-Argumente? Das ist das T. Also muss es als Template-Parameter angegeben werden. Das sehen Sie hier. Die Länge und Reihenfolge der Liste der Template-Argumente muss der der Template-Parameter des primären Templates entsprechen. Wie sah das primäre Template aus? Das hat an der ersten Position typename T, an der zweiten Position int Line, an der dritten Position int Column und es entspricht genau dem hier. Das ist mein typename T. Das ist mein int Line und das ist mein int Column. Jetzt kommt die Regel, wo Sie noch kein Beispiel dazu gesehen haben. Werden für die Template-Parameter Default-Argumente verwendet, müssen diese nicht in der Liste der Template-Argumente angegeben werden. Default-Argumente sind nur für primäre Templates zulässig. Das zeige ich Ihnen gleich in der Anwendung. Aber erst noch ein kleines bisschen mehr an Regeln. Es gibt Regeln für die Auswahl der richtigen Spezialisierung. Dabei gehe ich von oben nach unten einmal durch. Der Compiler findet nur eine Spezialisierung. Er erzeugt eine Instanz aus dieser. Das ist ein relativ einfacher Fall. Der Compiler findet mehrere Spezialisierungen. Er verwendet die am meisten spezialisierte. Das ist die grundlegende Idee vom Speziellen zum Allgemeinen. Findet der Compiler keine am meisten spezialisierte Klassen-Templates, kommt es zu einem Compilerfehler. In diesem Fall kann sich der Compiler nicht entscheiden. Er hat mehr als eine Möglichkeit und alle sind gleich gut. Der dritte Fall: Der Compiler findet keine Spezialisierung. Dann erzeugt er eine Instanz aus dem primären Template. Jetzt muss ich noch ein kleines bisschen formal werden. Was heißt, ein Template A ist mehr spezialisiert als ein Template B? Alle Argumente, die A annehmen kann, kann auch B annehmen. B kann Argumente annehmen, die A nicht annehmen kann. Das heißt, A ist mehr spezialisiert als B. Nun nach der vielen Theorie die Praxis. Hier habe ich das Template von vorher noch einmal, das Klassen-Template. Erst einmal die primäre, die partielle und nochmal eine partielle Spezialisierung. Das primäre Template hat eine zusätzliche Methode numberOfElements. Da gebe ich einfach die Anzahl der Elemente aus, die das Template halten kann und da es eine Matrix ist, bedeutet es, Zeile mal Spalten. Das ist einfach die Anzahl der Elemente, die meine Matrix halten kann. Hier das primäre Template. Da kommt hier noch eine Besonderheit hinzu. Sowohl für den ersten Typ Parameter T, wie auch für die zweite und dritte Nicht-Typ-Parameter habe ich Default-Werte eingeben. Im ersten Fall ist es ein std::string. Im zweiten Fall ist es die Zahl 100 und im dritten Fall ist der Wert von Line. Das war das primäre Template. Nun kommt die erste partielle Spezialisierung. Die partielle Spezialisierung gilt für das, dass die Column und die Line beide 3 sind, hingegen den Typ-Parameter lasse ich noch frei. Die Anzahl der Elemente ist klar, ist 3 mal 3 ist 9. Nun kommt noch die letzte Spezialisierung, die letzte partielle Spezialisierung um genauer zu sein. Hier lege ich den Typ-Parameter fest auf double. Hingegen Line und Column lasse ich frei und die Anzahl der Elemente ist natürlich in diesem Fall wiederum Line mal Column. Jetzt wende ich die Templates ein paar Mal an. Zuerst instanziiere ich ein Template mit double 10, 5. Was passiert dann? Es wird dieses Template ausgewählt. Im zweiten Fall verwende ich die partielle Spezialisierung int, 3, 3 und das passt genau hier drauf. Im dritten Fall verwende ich double, 10, 10 und das passt wiederum auf die zweite partielle Spezialisierung. Der vierte Fall ist hier. Hier gebe ich gar nichts an in der Liste der Template-Argumente. Was passiert? Nun schlagen alle Defaults hier oben zu. Also T erhält den Wert std::string. Line erhält den Wert 100. Column erhält den Wert auch in diesem Fall 100, weil dadurch Line bestimmt wird. Eine Besonderheit muss ich Ihnen noch zeigen. Da bin ich nämlich selber reingefallen. Hier muss ich explizit aber sagen, dass ich ein Template haben will. Wenn ich die Syntax hier oben ohne eckige Klammer verwenden will, dann ist es so ähnlich wie bei Funktions-Templates. Wenn ich Funktion-Templates verwende, muss auch ausdrücken, dass mich die freien Funktionen nicht interessieren und das drücke ich hier damit aus. So ist es auch für Klassen-Templates. Hier drücke ich damit aus, dass ich nicht an einer Klasse interessiert bin, sondern an einem Klassen-Template. Was jetzt noch fehlt, ist das Programm laufen zu lassen und Sie sehen, 5 mal 10 ist 50, 3 mal 3 ist 9. Das ist jetzt nicht so spannend. 10 mal 10 ist 100 und wie kommen die 10000 zustande. Das ist 100 mal 100. In dieser Lektion habe ich Ihnen eine partielle Template-Spezialisierung vorgestellt. Ich habe Ihnen das Zusammenspiel von Template-Parametern und Template-Argumenten gezeigt. Ich habe Ihnen auch wichtige Regeln rund um die partielle Template-Spezialisierung erläutert. Eine Regel würde ich gerne noch einmal wiederholen. Wenn der Compiler ein Template sucht, dann geht er immer vom Speziellen zum Allgemeinen.

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!