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::optional
sprawia, ż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::optional
zapewnia 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 -1
na max_count
jeśli nie chcesz limit” lub „pass std::numeric_limits<double>::min()
na min_match_score
jeś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::optional
i std::optional
będą zasadniczo identyczne pod względem zachowania i użycia.