Aklıma gelen en basit örnek:
std::optional<int> try_parse_int(std::string s)
{
//try to parse an int from the given string,
//and return "nothing" if you fail
}
Aynı şey bunun yerine bir referans argümanıyla da gerçekleştirilebilir (aşağıdaki imzada olduğu gibi), ancak kullanmak std::optional
imzayı ve kullanımı daha güzel kılar.
bool try_parse_int(std::string s, int& i);
Bunu yapmanın başka bir yolu da özellikle kötü :
int* try_parse_int(std::string s); //return nullptr if fail
Bu, dinamik bellek tahsisi, sahiplik endişesi vb. Gerektirir - her zaman yukarıdaki diğer iki imzadan birini tercih edin.
Başka bir örnek:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
Bu, std::unique_ptr<std::string>
her telefon numarası için a gibi bir şeye sahip olmak yerine son derece tercih edilir ! std::optional
size performans için harika olan veri konumunu sağlar.
Başka bir örnek:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
Aramada belirli bir anahtar yoksa, "değer yok" döndürebiliriz.
Bunu şu şekilde kullanabilirim:
Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");
Başka bir örnek:
std::vector<std::pair<std::string, double>> search(
std::string query,
std::optional<int> max_count,
std::optional<double> min_match_score);
Bu, diyelim ki, olası her kombinasyonu alan max_count
(veya almayan) ve min_match_score
(veya almayan) dört fonksiyon aşırı yüklemesine sahip olmaktan çok daha mantıklıdır !
Ayrıca ortadan kaldırır lanetli "Geçer -1
için max_count
veya" Geçer Bir sınır istemiyorsanız " std::numeric_limits<double>::min()
için min_match_score
bir asgari puanı istemiyorsanız"!
Başka bir örnek:
std::optional<int> find_in_string(std::string s, std::string query);
Sorgu dizesi içinde değilse s
, "hayır int
" istiyorum - birinin bu amaçla kullanmaya karar verdiği özel bir değer değil (-1?).
Ek örnekler için boost::optional
belgelere bakabilirsiniz . boost::optional
ve std::optional
temelde davranış ve kullanım açısından aynı olacaktır.