Najprostszy przykład jaki przychodzi mi do głowy:
std::optional<int> try_parse_int(std::string s)
{
}
To samo można osiągnąć za pomocą argumentu referencyjnego (jak w poniższej sygnaturze), ale użycie std::optionalsprawia, że podpis i użycie są przyjemniejsze.
bool try_parse_int(std::string s, int& i);
Inny sposób, w jaki można to zrobić, jest szczególnie zły :
int* try_parse_int(std::string s);
Wymaga to dynamicznej alokacji pamięci, martwienia się o własność itp. - zawsze preferuj jeden z dwóch pozostałych podpisów powyżej.
Inny przykład:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
Jest to bardzo korzystne rozwiązanie zamiast mieć coś takiego jak „a” std::unique_ptr<std::string>dla każdego numeru telefonu! std::optionalzapewnia lokalizację danych, która jest świetna do wydajności.
Inny przykład:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
Jeśli wyszukiwanie nie zawiera określonego klucza, możemy po prostu zwrócić „brak wartości”.
Mogę to wykorzystać w ten sposób:
Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");
Inny przykład:
std::vector<std::pair<std::string, double>> search(
std::string query,
std::optional<int> max_count,
std::optional<double> min_match_score);
Ma to o wiele więcej sensu niż, powiedzmy, cztery przeciążenia funkcji, które przyjmują każdą możliwą kombinację max_count(lub nie) i min_match_score(lub nie)!
To również eliminuje ten przeklęty „pass -1na max_countjeśli nie chcesz limit” lub „pass std::numeric_limits<double>::min()na min_match_scorejeśli nie chcesz wynik minimum”!
Inny przykład:
std::optional<int> find_in_string(std::string s, std::string query);
Jeśli ciągu zapytania nie ma s, chcę "nie int" - nie jakiejkolwiek specjalnej wartości, którą ktoś zdecydował się użyć w tym celu (-1?).
Dodatkowe przykłady można znaleźć w boost::optional dokumentacji . boost::optionali std::optionalbędą zasadniczo identyczne pod względem zachowania i użycia.