SORU
31 Mayıs 2013, Cuma


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
31 Mayıs 2013, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • failblog

    failblog

    17 HAZİRAN 2008
  • Major FX

    Major FX

    6 HAZİRAN 2012
  • super1988guy

    super1988guy

    9 Aralık 2007