C++ Grundkurs

Variadic-Templates

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Zusätzlich verfügt C++ mit dem Variadic-Template über ein weiteres Template. Dieses besitzt die Fähigkeit, beliebig viele Parameter aufzunehmen.
05:29

Transkript

In dieser Lektion will ich Ihnen Variadic-Templates vorstellen. Variadic-Templates sind Templates, die beliebig viele Parameter annehmen können. Variadic-Templates sind ein relativ anspruchsvolles Thema in C++. Wie schaut ein Variadic-Template aus? Das hier ist ein Variadic-Template. Tatsächlich ist es ein Funktions-Template. Das Entscheidende sind die drei Punkte hier und die drei Punkte hier. Diese drei Punkte bezeichnen eine sogenannte Ellipse. Durch diese Ellipse wird das Args hier zum sogenannte Template-Parameter-Pack. Das args hier zu einem sogenannten Funktions-Parameter-Pack. Mit diesen Parameter-Packs können Sie zwei Dinge tun. Sie können sie packen und entpacken. Das Entscheidende ist, wo die Punkte stehen. Stehen sie links von Args, wird das Parameter-Pack gepackt. Stehen sie rechts von Args, wird das Parameter-Pack entpackt. Das Schöne am Funktions-Template, das gilt natürlich auch für Variadic-Templates ist, dass der Compiler automatisch die Template-Argumente aus den Funktionsargumenten ableiten kann. Noch ein paar weitere Regeln zu Variadic-Templates. Variadic-Templates werden häufig in der Standard Template Library verwendet. Zum Beispiel gibt es die sizeof-Funktion oder den sizeof-Operator. Dem können Sie eine beliebige Anzahl an Argumenten geben und er ermittelt Ihnen, wie viel das tatsächlich waren. Das zeige ich nachher in der Anwendung. Da gibt es aber auch den neuen Containerstandard tuple. std::tuple ist ein heterogener Container beliebiger Länge. In beliebiger Länge steckt es schon drinnen. Unter der Decke ist es eine Variadic-Template. Aber auch einfache Funktionen oder Funktions-Templates mit std::thread, die Ihnen einen neuen thread erzeugen, können beliebig viele Parameter annehmen. Also auch wieder ein Variadic-Template. Die Verwendung von Variadic-Templates folgt dem typischen Muster. Ein Muster, das eigentlich aus der funktionalen Welt bekannt ist. Als erstes führe eine Operation rekursiv auf dem ersten Element des Parameter-Packs aus und reduziere nach jeder Iteration das Parameter-Pack um sein erstes Element. Damit endet die Rekusion nach endlich vielen Schritten. Das zeige ich Ihnen hier. Das ist ein Codeschnipsel, den ich gleich genauer erläutere im Beispiel. Hier habe ich ein Klassen-Template. Das nennt sich Mult. Was soll das Klassen-Template tun? Das soll beliebig viele Parameter annehmen können und sie dann multiplizieren und das Ergebnis zurückgeben. Dieses Klassen-Template Mult erwartete Null Argumente. Dieses hier, das allgemeinere, erwartet mindestens ein Argument. Das erste ist i und der Rest ist tail. Also anders ausgedrückt Kopf und Tail. Was macht es im Funktionskörper? Es nimmt den ursprünglichen Wert und, das ist die entscheidende Beobachtung, es führt Mult nochmals auf. Mult ruft sich selber auf. Aber in diesem Fall das Mult hier bekommt ein Argument mehr wie das Mult hier. Das heißt, mit jedem Aufruf agiert das Klassen-Template auf einem Argument weniger, bis irgendwann kein Argument mehr da ist und dann wird dieses Mult aufgerufen und dann ist die ganze Iteration weg. Das war vermutlich relativ anspruchsvoll. Nun zeige ich es im Beispiel. Zuerst die Funktion sizeOf. Die kann eine beliebige Anzahl von Argumenten annehmen und gibt als Ergebnis einfach die Anzahl der Argumente zurück. Da habe ich ein kleines Funktions-Template darum geschrieben, das mit Parameter-Packs umgeht. Jetzt zeige ich in der Anwendung. printSize, wenn ich kein Argument angebe, bekomme ich als Ergebnis, jetzt führe ich es schon aus, natürlich die 0. Wenn ich eins, zwei, drei Argumente angebe, bekomme ich als Ergebnis die 3. Wenn ich eins, zwei, drei, vier, fünf Argumente angebe, bekomme ich als Ergebnis die 5. Das war Parameter-Pack angewandt in einem Funktions-Template. Jetzt zeige ich Ihnen noch einen bisschen anspruchsvolleren Fall in einem Klassen-Template. Das Klassen-Template soll mir das Produkt von mehreren Zahlen berechnen. Zuerst deklariere ich hier oben das sogenannte primäre Template Mult. Das benötigt keinen Template-Körper. Da reicht die reine Deklaration. Das fängt aber die C++-Syntax. Dann definiere ich hier zwei Spezialisierungen. Eine Spezialisierung zu Mult, das kein Argument bekommt und eine Spezialisierung für Mult, das mindestens ein Argument bekommt. Also das erste Argument und tail, auf Deutsch der Schwanz, also der Rest. Was macht das jetzt? Ich zeige es einmal am Beispiel am besten. Wenn ich Mult<10::value: aufrufe, wie hier, wird dieses Klassen-Template verwendet, weil ich mindestens ein Argument habe. Das i wird zu dem i hier. Das Ergebnis ist 10 mal, und jetzt rufe ich Mult von keinem Argument mehr auf und kein Argument gibt immer die 1 zurück. Also 10 mal 1 ist 10. Wenn ich das mit drei Argumenten aufrufe, Mult<10, 10, 10 wird dieses Klassen-Template aufgerufen. Bewirkt, dass im ersten Schritt die i hier zu 10 wird und dann rufe ich Mult von 10,10 auf. Also genau eine 10 weniger. Also bekomme ich 10 mal 10 mal 10 mal 1 usw. Das Gleiche klappt in diesem Fall hier. Da ist natürlich dann die Fakultät von 5. In dieser Lektion habe ich Ihnen Variadic-Templates vorgestellt. Variadic-Templates sind Templates, die beliebig viele Argumente annehmen können. Variadic-Templates werden sehr häufig in der Standard Template Library verwendet. Sie sind aber ein relativ anspruchsvolles Konzept.

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!