Nasıl bir std kullanmalı::isteğe bağlı?
std::experimental::optional
belgeleri okuyorum ve ne yaptığını hakkında iyi bir fikrim var, ama anlamıyorumne zamanBunu kullanmam gerektiğini nasıl kullanıyor yoksa ben mi. Site bana bu nesne gerçek kavramını kavramak için zor bırakır henüz herhangi bir örnek içermiyor. std::optional
kullanmak için iyi bir seçimdir, ve nasıl bir önceki Standart bulunamadı şeyi telafi ediyor (C 11).
CEVAP
Aklıma 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ı şeyi bir başvuru bağımsız değişkeni ile yerine başarılı olabilir (aşağıdaki imza gibi), ama std::optional
kullanarak imza ve kullanımı daha güzel yapar.
bool try_parse_int(std::string s, int& i);
Bu konuda yapılabilecek başka bir yoludurözellikle kötü:
int* try_parse_int(std::string s); //return nullptr if fail
Bu dinamik bellek ayırma, mülkiyet, vb hakkında endişelenmeyi gerektirir. - her zaman yukarıdaki diğer iki imza bir tercih.
Başka bir örnek:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
Bunun yerine bir şey std::unique_ptr<std::string>
Her telefon için bir numara gibi olması için son derece tercih edilir! std::optional
performans için harika Verileri Konum verir.
Başka bir örnek:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
Eğer bu arama belirli bir anahtar yok eğer doğru değilse, o zaman sadece "hayır değer." dönebiliriz.
Bu gibi kullanabilirsiniz:
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 daha mantıklı, ki max_count
(veya değil) ve min_match_score
mümkün olan her kombinasyonu (ya da değil) bu dört işlev aşırı olan yapar!
Ayrıcaortadan kaldırırlanetliEğer bir sınır istemiyorsan eğer ... "max_count
-1
Pass" ya da eğer en az bir puan istemiyorsun eğer ... "min_match_score
std::numeric_limits<double>::min()
Pass"!
Başka bir örnek:
std::optional<int> find_in_string(std::string s, std::string query);
Eğer sorgu dizesi s
, "int
" -- . istiyorum değil eğer ..değilbiri bu amaç (-1?) için kullanmaya karar ne olursa olsun.
Diğer örnekler için, boost::optional
documentationBu bakabilirsin. boost::optional
ve std::optional
temelde davranış ve kullanımı açısından aynı olacaktır.
Nasıl MySQL bazan isteğe bağlı olarak ...
Nasıl C isteğe bağlı parametreler kull...
isteğe bağlı yerel değişkenler kısmi ş...
Nasıl Oracle üzerinde isteğe bağlı bir...
Nasıl isteğe bağlı yöntemler ile bir p...