namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:optional

<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
kennen/include/optional.txt · Zuletzt geändert: 2017-05-02 15:18 (Externe Bearbeitung)