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

Perfect Forwarding

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
C++ verfügt mit dem Perfect Forwarding über ein Feature, welches es erlaubt, Argumente von Funktions-Templates identisch weiterzureichen.
04:19

Transkript

In dieser Lektion möchte ich Ihnen Perfect-Forwarding mit Template-Parameter vorstellen. Erst einmal, was ist Perfect-Forwarding? Perfect-Forwarding bezeichnet eine Technik, bei der ein Funktions-Template oder ein Methoden-Template ihre Argumente annimmt und sie identisch weiterreicht. Das heißt insbesondere, dass Lvalues und Rvalues Eigenschaften erhalten bleiben. Das heißt, in diesem Fall temporäre Objekte bleiben temporäre Objekte. Perfect-Forwarding ist ein sehr mächtiges Werkzeug für den Bibliotheksautor, um generische Funktions-Templates zu schreiben. Funktions-Templates also, die vollkommen unabhängig von Typen verwendet werden können. Für diese Funktions-Templates gibt es zwei klassische Anwendungsfälle. Das sind generische Fabrikfunktionen. Das heißt, ich schiebe etwas in die Funktion rein und bekomme etwas zurück. Oder auch Konstruktoren. Konstruktor ist öfters so, dass Sie einen Konstruktor mit Argumenten füttern und der ruft unter der Decke einen anderen Konstruktor auf und dem wollen Sie die Argumente identisch weiterreichen, eben Perfect-Forwarding. Technisch relativ anspruchsvoll, weil sie ein paar Techniken voraussetzt. Zum einen wendet sie Move-Semantik an oder auch Verschiebe-Semantik. Unter der Decke läuft es darauf hinaus, dass die Funktion std::forward verwendet wird. Daher heißt auch die Technik so Perfect-Forwarding. Darüber hinaus werden die Typen der Template-Argumente automatisch aus den Funktionsargumenten abgeleitet. Da geht es also um Funktions-Templates. Zum Schluss noch wollen Sie beliebig viele Argumente fürs Funktions-Template verwenden. Hier kommen also Variadic-Templates in Spiel. Jetzt zeige ich Ihnen das Ganze in der Anwendung, dann wird es deutlich klarer, denke ich. Hier habe ich eine vollkommene generische Funktion. Die will ich mir mit Ihnen sehr genau anschauen. Was macht die Funktion? Das ist eine sogenannte Fabrikfunktion. Die Fabrikfunktion bekommt als Argumente, als Typ-Argument T und eine beliebige Anzahl von weiteren Typ-Argumenten. Was macht Sie? Sie erzeugt ein T und verwendet die Argumente, die hier drinnen stehen, als Argumente für den Aufruf von T. Ich gebe also einen Typ T hinein. Die Argumente für den Typ T unter der Decke wird mir ein Konstruktor-Aufruf gemacht, für T mit diesen Argumenten. Das zeige ich gleich in der Anwendung. Hier erzeuge ich meinen neuen Typ MyStruct, nur um zu zeigen, ich kann das Funktions-Template auch für beliebige Typen anwenden. MyStruct hat einen Konstruktor, der ein int erwartet, eine Referenz auf ein int, ganz konkret eine Lvalue-Referenz auf ein Double und eine Rvalue-Referenz auf ein Double. Dann überlade ich für MyStruct noch den Ausgabeoperator. Ich will einfach MyStruct auch ausgeben können, damit Sie das Ergebnis dann sehen können. Den erkläre ich als Freund und implementiere ihn als freie Funktion. Nun kommt die Anwendung. Zuerst erzeuge ich hier ein Double. Ich sage createT double. Im Funktionskörper von createT wird dann der Konstruktor von double aufgerufen und als Ergebnis bekomme ich ein double zurück und das kann ich natürlich ausgeben hier. Dann sage ich "createT int". Hier erzeuge ich ein int mit dem Initialwert 1. Double wird hier den Wert 0 besitzen. Hier den Wert 1 bei int. Was mache ich hier? Hier erzeuge ich einen std:.string initialisiert mit dem Wert myString. Den speichere ich natürlich in My String ab und kann ihn dann natürlich auch ausgeben. Jetzt erzeuge ich myStruct. myStruct benötigt Lvalue, Lvalue, Rvalue. Lvalue, Lvalue, Rvalue. Lvalue-Referenz, weil myInt hat einen Namen. myDouble hat genauso einen Namen. Das sind die Variablen von hier oben und 3.14 ist ein Rvalue, weil es ist ein expliziter Wert. Jetzt lasse ich noch die ganze Magie laufen. Sie sehen myDouble 0, myInt 1, myString hier und myStruct wird aus diesem Grund ausgegeben, weil das tut genau mein überladener Ausgabeoperator. In dieser Lektion habe ich Ihnen Perfect-Forwarding gezeigt. Perfect-Forwarding bezeichnet die Fähigkeit eines Methoden und eines Funktions-Templates seine Argumente anzunehmen und unverändert weiterzureichen. Diese Funktionalität wird gerne bei Konstruktoren oder auch bei Fabrikfunktionen benötigt.

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!