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::optionalmacht 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::optionalbietet 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 -1für, max_countwenn Sie kein Limit wollen" oder "Pass std::numeric_limits<double>::min()für, min_match_scorewenn 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::optionalund std::optionalwird grundsätzlich in Bezug auf Verhalten und Nutzung identisch sein.