namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:optional

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

kennen:include:optional [2017-05-02 15:18] (aktuell)
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 (Externe Bearbeitung)