Das einfachste Beispiel, das ich mir vorstellen kann:
std::optional<int> try_parse_int(std::string s)
{
//try to parse an int from the given string,
//and return "nothing" if you fail
}
Dasselbe kann stattdessen mit einem Referenzargument erreicht werden (wie in der folgenden Signatur), aber die Verwendung std::optional
macht die Signatur und Verwendung angenehmer.
bool try_parse_int(std::string s, int& i);
Eine andere Möglichkeit, dies zu tun, ist besonders schlecht :
int* try_parse_int(std::string s); //return nullptr if fail
Dies erfordert eine dynamische Speicherzuweisung, Bedenken hinsichtlich des Eigentums usw. - bevorzugen Sie immer eine der beiden anderen oben genannten Signaturen.
Ein anderes Beispiel:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
Dies ist extrem vorzuziehen, anstatt std::unique_ptr<std::string>
für jede Telefonnummer so etwas wie eine zu haben!std::optional
bietet Ihnen Datenlokalität, was sich positiv auf die Leistung auswirkt.
Ein anderes Beispiel:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
Wenn die Suche keinen bestimmten Schlüssel enthält, können wir einfach "kein Wert" zurückgeben.
Ich kann es so benutzen:
Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");
Ein anderes Beispiel:
std::vector<std::pair<std::string, double>> search(
std::string query,
std::optional<int> max_count,
std::optional<double> min_match_score);
Dies ist viel sinnvoller als beispielsweise vier Funktionsüberladungen, die jede mögliche Kombination von max_count
(oder nicht) und min_match_score
(oder nicht) erfordern!
Es beseitigt auch den verfluchten "Pass -1
für, max_count
wenn Sie kein Limit wollen" oder "Pass std::numeric_limits<double>::min()
für, min_match_score
wenn Sie keine Mindestpunktzahl wollen"!
Ein anderes Beispiel:
std::optional<int> find_in_string(std::string s, std::string query);
Wenn die Abfragezeichenfolge nicht vorhanden ist s
, möchte ich "Nein int
" - nicht den speziellen Wert, den jemand für diesen Zweck verwendet hat (-1?).
Weitere Beispiele finden Sie in der boost::optional
Dokumentation . boost::optional
und std::optional
wird grundsätzlich in Bezug auf Verhalten und Nutzung identisch sein.