================== Perfect Forwarding [TOC] ================== Wenn wir nicht mit _lvalue references_ arbeiten und Parameter möglichst mit minimalen Aufwand an andere Funktionen weitergeben möchten, gibt es zwei Fälle: * Uns werden _lvalues_ übergeben: Dann ist es am geschicktesten, diese per Referenz zu akzeptieren, um eine Kopie zu vermeiden. * Uns werden _rvalues_ übergeben: Dann wäre es am besten, diese jeweils verschiebenderweise zu übermitteln, also mit `std::move`. Das würde uns nötigen, jeweils zwei Varianten zu schreiben: ---- CODE (type=cpp) ------------------------------------------------------- template void do_sth(T& t) { f(t); // Weitergabe als Referenz } template void do_sth(T&& t) { f(std::move(t)); // Verschieben des Parameters } ---------------------------------------------------------------------------- In C++ lassen sich glücklicherweise beide Varianten vereinigen, da bei einer Template-Funktion und `&&` beide Varianten akzeptiert werden. Dann müssten wir aber in Abhängigkeit der Übergabe mal `std::move` verwenden, mal nicht. Dieses Problem erledigt `std::forward`: ---- CODE (type=cpp) ------------------------------------------------------- template void do_sth(T&& t) { f(std::forward(t)); // Verschieben des Parameters } ---------------------------------------------------------------------------- Die explizite Angabe des Typs _T_ bei `std::forward` ist wichtig, da aus _T_ abgeleitet werden kann, ob es eine Parameterübergabe per _lvalue_ oder _rvalue_ war. Dann kann entsprechend bedingt `std::move` zum Einsatz kommen oder nicht. Aufgabe ======= Fügen Sie noch eine Template-Funktion `print_csv_line` hinzu, die analog eine CSV-Zeile ausgibt. Dabei ist _perfect forwarding_ einzusetzen. Vorlage ======= :import: session09/step04/update-with-index.hpp [fold] :import: session09/step04/csv-reader.hpp [fold] :import: session09/step04/read-cities.cpp :navigate: up -> doc:index back -> doc:session09/page06 next -> doc:session09/page08