L'esempio più semplice che mi viene in mente:
std::optional<int> try_parse_int(std::string s)
{
//try to parse an int from the given string,
//and return "nothing" if you fail
}
La stessa cosa potrebbe essere realizzata con un argomento di riferimento (come nella firma seguente), ma l'utilizzo std::optional
rende la firma e l'utilizzo più piacevoli.
bool try_parse_int(std::string s, int& i);
Un altro modo in cui ciò potrebbe essere fatto è particolarmente negativo :
int* try_parse_int(std::string s); //return nullptr if fail
Ciò richiede l'allocazione dinamica della memoria, la preoccupazione per la proprietà, ecc. - Preferisci sempre una delle altre due firme sopra.
Un altro esempio:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
Questo è estremamente preferibile invece di avere qualcosa di simile a un std::unique_ptr<std::string>
per ogni numero di telefono! std::optional
ti dà la localizzazione dei dati, il che è ottimo per le prestazioni.
Un altro esempio:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
Se la ricerca non contiene una determinata chiave, possiamo semplicemente restituire "nessun valore".
Posso usarlo in questo modo:
Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");
Un altro esempio:
std::vector<std::pair<std::string, double>> search(
std::string query,
std::optional<int> max_count,
std::optional<double> min_match_score);
Questo ha molto più senso di, diciamo, avere quattro sovraccarichi di funzioni che prendono ogni possibile combinazione di max_count
(o no) e min_match_score
(o no)!
Ha inoltre elimina la maledetta "Passo -1
per max_count
se non si desidera un limite" o "Passo std::numeric_limits<double>::min()
per min_match_score
se non si desidera un punteggio minimo"!
Un altro esempio:
std::optional<int> find_in_string(std::string s, std::string query);
Se la stringa di query non è presente s
, desidero "no int
", non quale valore speciale qualcuno abbia deciso di utilizzare per questo scopo (-1?).
Per ulteriori esempi, è possibile consultare la boost::optional
documentazione . boost::optional
e std::optional
sarà sostanzialmente identico in termini di comportamento e utilizzo.