namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:optional
no way to compare when less than two revisions

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


kennen:include:optional [2017-05-02 15:18] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== <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:
 +<code cpp>
 +#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());
 +}
 +</code>
 +
 +
 +===== Zugriff =====
 +Ohne gültigen Wert wirft der Zugriff mit der Methode ''value()'' eine Ausnahme, 
 +mit ''value_or(something_else)'' kann ein Ersatzwert angegeben werden.
 +<code cpp>
 +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';
 +}
 +</code>
 +===== 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.
 +<code cpp>
 +if (auto result2 = find_smallest({1,2,3}))
 +{
 +  std::cout << *result2 << '\n';
 +}
 +</code>
 +===== 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 ''='':
 +<code cpp>
 +result.reset();
 +result = std::null_opt;
 +result = 42;
 +std::cout << *result << '\n';
 +</code>
 +
 +===== Objekt aus Parametern bauen =====
 +Das zu verpackende Objekt kann aus seinen Konstruktorparametern direkt im Wrapper gebaut werden:
 +<code cpp>
 +auto o = std::optional<std::vector<char>>(std::in_place, 10, '-'); // erzeugt Vector mit 10 '-'
 +
 +o.emplace<std::vector<char>>(10, '-'); // oder so
 +</code>
kennen/include/optional.txt · Zuletzt geändert: 2017-05-02 15:18 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki