Самый простой пример, который я могу придумать:
std::optional<int> try_parse_int(std::string s)
{
//try to parse an int from the given string,
//and return "nothing" if you fail
}
То же самое может быть выполнено с помощью аргумента ссылки (как в следующей подписи), но использование std::optional
делает подпись и использование более удобными.
bool try_parse_int(std::string s, int& i);
Другой способ сделать это особенно плох :
int* try_parse_int(std::string s); //return nullptr if fail
Это требует динамического распределения памяти, беспокойства о праве собственности и т. Д. - всегда предпочитайте одну из двух других подписей выше.
Другой пример:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
Это крайне предпочтительно, чем иметь что-то вроде a std::unique_ptr<std::string>
для каждого номера телефона! std::optional
дает вам локальность данных, которая отлично подходит для производительности.
Другой пример:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
Если поиск не содержит определенного ключа, мы можем просто вернуть «нет значения».
Я могу использовать это так:
Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");
Другой пример:
std::vector<std::pair<std::string, double>> search(
std::string query,
std::optional<int> max_count,
std::optional<double> min_match_score);
В этом гораздо больше смысла, чем, скажем, иметь четыре перегрузки функций, которые принимают все возможные комбинации max_count
(или нет) и min_match_score
(или нет)!
Он также устраняет в проклятое «Pass -1
для , max_count
если вы не хотите предел» или «Pass std::numeric_limits<double>::min()
для min_match_score
если вы не хотите , минимальный балл»!
Другой пример:
std::optional<int> find_in_string(std::string s, std::string query);
Если строки запроса нет s
, я хочу «нет int
» - не какое-то особое значение, которое кто-то решил использовать для этой цели (-1?).
Дополнительные примеры вы можете найти в boost::optional
документации . boost::optional
и в std::optional
основном будут идентичны с точки зрения поведения и использования.