C++: std::optional aus Funktion zurückgeben

English Deutsch

Hier ist eine Vorlage für die Rückgabe eines std::optional aus einer Funktion:

optional_function.cpp
#include <optional>
// Mit --std=c++17 oder äquivalent kompilieren

std::optional<double> myOptionalFunction() {
    auto myValue = /* ... */;
    if(myValue.IsNull()) {
        // Wir haben keinen Wert
        return std::nullopt; // .has_value() => false
    }
    // Wir haben einen Wert, also den Wert zurückgeben
    return myValue.AsDouble(); // .has_value() => true
}

std::nullopt ist die einfache Methode, um keinen Wert als std::optional zurückzugeben. Wenn man diese Methode anstelle des Standardkonstruktors (return std::optional<double>() in diesem Fall) verwendet, muss man nicht explizit den vollständigen qualifizierten Namen inklusive Template-Argument angeben (optional<double>, wenn man use namespace std; verwendet). Es ist viel einfacher zu lesen und zu kopieren.

In der letzten Zeile können wir einfach einen double zurückgeben (myValue.AsDouble() in diesem Beispiel). Warum? Weil dies implizit den impliziten Konstruktor von std::optional<double>(const double& value) aufruft und somit den double in eine std::optional<double>()-Instanz konvertiert.

Verwendungsbeispiel:

usage_example.cpp
#include // std::optional
#include  // std::cerr, std::endl

using namespace std;

std::optional myOptionalFunction() {
    /* Ihr Code kommt hier hin ! */
}

int main() {
    auto myOptionalValue = myOptionalFunction;
    if(myOptionalValue.has_value()) {
         // Fehlermeldung ausgeben
         cerr << "Das Optional hat keinen Wert!" << endl;
         return;
    }
    // Wert extrahieren
    auto myValue = myOptionalValue.value();
    /* Hier können Sie etwas mit myValue machen! */
}

Alternativ können Sie std::optional<T>::value_or() wie folgt verwenden, um entweder den Wert oder einen Standardwert zurückzugeben:

value_or_example.cpp
#include <optional> // std::optional
#include <iostream> // std::cerr, std::endl

using namespace std;

std::optional<double> myOptionalFunction() {
    /* Ihr Code kommt hier hin ! */
}

int main() {
    auto myOptionalValue = myOptionalFunction;
    const double defaultValue = 0.0;
    // Wert ist 0.0, wenn myOptionalFunction() <keinen Wert> zurückgab
    auto myValue = myOptionalValue.value_or(defaultValue);
    /* Hier können Sie etwas mit myValue machen! */
}

Check out similar posts by category: C/C++