C++ Grundkurs

Template-Parameter ableiten

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Der Compiler leitet standardmäßig die Template-Parameter aus den Template-Argumenten bei der Verwendung von Funktions-Templates automatisch ab.
04:46

Transkript

In dieser Lektion will ich die Argument-Ableitung von Template-Argumenten vorstellen. Bei Funktions-Templates kann der Compiler ein Template-Argument aus den Funktions-Templates ableiten. Das Schöne daran ist, dass ich somit Funktions-Templates genau wie Funktionen anfühlen. Bei dieser Ableitung wendet der Compiler minimale Konvertierungen an. Das heißt, der Compiler entfernt gegebenenfalls nur das äußerste const von den Funktions-Argumenten und konvertiert C-Arrays oder Funktionen in Zeiger. Da der Compiler nur minimale Konvertierungen anwendet, können leicht Syntaxfehler resultieren. Hier ein klassisches Beispiel. Ich habe hier eine Funktion template isSmaller, das ein Typ-Argument T erwartet. Die tatsächlichen Werte first und second sollen von diesem einen Typ-Argument T sein. Wenn ich jetzt isSmaller mit einem int und mit einer long long int aufrufe, moniert jetzt der Compiler, weil er weder das eine noch das andere in das andere konvertiert. Wie lässt sich das Problem lösen? Wenn ich einen zweiten Template-Parameter für ein zweites Funktionsargument einführe, hier T, T, U, U, geht es gut, weil jetzt leitet er T aus 1 nach int ab. Bestimmt U aus sec und stellt fest, dass U von Typ long long int ist und damit geht es gut. Noch eine weitere Besonderheit bei der Argument-Ableitung. Explizite Template-Argumente. Manchmal ist es nicht möglich, die Template-Parameter aus den Funktionsargumenten zu bestimmten. Klassischer Anwendungsfall ist, wenn Sie ein Funktions-Template schreiben, wo Sie einen Return-Wert angeben müssen und Sie wissen nicht genau welcher. Hier habe ich ein klassisches Beispiel. Ich habe hier ein Funktions-Template add. Das sind zwei Zahlen. Eine Zahl vom Typ T und eine Zahl vom Typ U. Die können also verschieden sein. Und gibt eine Zahl vom Typ R zurück. Daher in den Funktionsargumenten nie der Rückgabetyp erwähnt wird, der steht auch nicht hier, kann der Compiler natürlich aus den Funktionsargumenten die Template-Argumente nicht ableiten. Sie können es aber explizit angeben. Durch add long long int, hier zwei Argumente 1000000 und 1000000, instanziiert der Compiler Template für den Return-Typ long long int jetzt. Das Schöne daran ist, dass Sie hier zwar den ersten Template-Parameter angeben, der zweite das T und der dritte das U wird automatisch vom Compiler bestimmt. Das Ganze zeige ich jetzt Ihnen noch in der Anwendung. Ich habe hier eine Funktion isSmaller. Die ist das Funktions-Template, das ein Template-Parameter erwartet, eben T. Es soll für first und für second gelten. Ein zweites Funktions-Template isSmaller2, diesmal erwartet es zwei Template-Paramter T und U jeweils für first und second. Das Dritte ist die add-Funktion von gerade eben. Jetzt zeige ich Ihnen die in der Anwendung. Wenn ich isSmaller von 1, 2 aufrufe, ist das syntaktisch richtig, weil 1 und 2 jeweils ints sind und somit passt es. Er kann für den Typ-Parameter T int ableiten. Wenn ich wie im Beispiel vorher eine 1, also ein int und ein long long int verwende, kann es der Compiler nicht bestimmten, weil das zwei verschiedene Typen sind. Ich kann dem Compiler aber vorschreiben, dass er dieses Funktions-Template für den Typ instanziieren soll. Das tut er dann auch und somit geht der Aufruf gut und er findet raus, welche der zwei Zahlen kleiner ist. Das Gleiche kann er natürlich auch für double tun. Da wird intern dann das int nach double konvertiert bzw. auch das long long int. Ich kann das Problem natürlich auch lösen, indem ich zwei Template-Parameter angebe. Dann wird in diesem Fall, wir sind hier bei isSmaller2, T wird zu int und U wird zu long long int. Jetzt kommt noch ein Beispiel, wo ich den Return-Wert explizit angebe. Hier addiere ich zwei Zahlen. Jetzt muss ich genau zählen. Müsste 1000000 sein und gebe explizit an, von welchem Typ der Rückgabetyp sein soll. In diesem Fall long long int. Ich kann es sogar so weit treiben dass ich im zweiten Fall den Typ T spezifiziere, den Typ R spezifiziere und den ersten Typ U unspezifiziert lasse. Das heißt, den Typ U wird er aus dieser Zahl ableiten, der Compiler. Ich kann aber auch alle drei Template-Parameter explizit angeben durch double, double und float. Das Ergebnis ist weniger spektakulär. Sie sehen, die letzten zwei Zahlen werden in der wissenschaftlichen Notation ausgegeben. In dieser Lektion habe ich Ihnen die automatische Ableitung der Template-Argumente gezeigt. Eine Fähigkeit, die Funktions-Templates besitzen. Das Schöne daran ist, dass ich somit ein Funktions-Template aus Anwendersicht wie eine Funktion anfühlt.

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!