C++: std::optional aus Funktion zurückgeben
Hier ist eine Vorlage für die Rückgabe eines std::optional aus einer Funktion:
#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:
#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:
#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! */
}