Inhaltsverzeichnis
<optional>
Wert, sofern vorhanden
Nicht in jedem Fall kann eine Funktion einen sinnvollen Wert liefern. So existiert in einer leeren Folge kein kleinster Wert.
C++17 kann dies mit std::optional<T>
ausdrücken:
#include <algorithm> #include <optional> #include <vector> std::optional<int> find_smallest(std::vector<int> v) { if (v.empty()) return {}; else return *min_element(v.begin(), v.end()); }
Zugriff
Ohne gültigen Wert wirft der Zugriff mit der Methode value()
eine Ausnahme,
mit value_or(something_else)
kann ein Ersatzwert angegeben werden.
auto result = find_smallest({}); std::cout << result.value_or(0) << '\n'; try { std::cout << result.value() << '\n'; } catch(const std::bad_optional_access& e) { std::cerr << e.what() << '\n'; }
Zeiger-Syntax
Optionale Variablen können wie smarte Zeiger angesprochen werden. Bei vorhandenem Objekt erfolgt der ungeprüfte Zugriff mit dem Operator *
auf den Wert bzw. mit →
auf Komponenten.
if (auto result2 = find_smallest({1,2,3})) { std::cout << *result2 << '\n'; }
Löschen und ändern
Ein reset()
oder die Zuweisung von std::nullopt
zerstört das evtl. vorhandene Objekt (ist aber nicht notwendig).
Die Zuweisung eines Wertes erfolgt mit =
:
result.reset(); result = std::null_opt; result = 42; std::cout << *result << '\n';
Objekt aus Parametern bauen
Das zu verpackende Objekt kann aus seinen Konstruktorparametern direkt im Wrapper gebaut werden:
auto o = std::optional<std::vector<char>>(std::in_place, 10, '-'); // erzeugt Vector mit 10 '-' o.emplace<std::vector<char>>(10, '-'); // oder so