Boost kullanımı :: isteğe bağlı <T> C ++ 'da NULL döndürmek için?

Bazı durumlarda NULL döndürmesi gereken bir işlev var ve bu işlevin dönüş değeri için sınanması gereken başka bir işlev var. Ben boost :: isteğe bağlı farkındayım ama sözdizimi nasıl kullanacağından emin değilim.

Aşağıda, söz konusu kullanımın basit bir örneği olacaktır:

int funct1(const string& key) {
 //use iterator to look for key in a map
  if(iterator == map.end()) {
    return NULL//need help here!
  else
    return it->second;
}

void funct2(string key) {
  if(funct1(key) == NULL) {//<-- need help here!
   //do something
  } else {
   //do something else
  }

Birisi sentaksta yardım edebilir mi?

Teşekkürler.

9
10 soru sordunuz ve 0 cevabı kabul ettiniz. Geri dönüp doğru cevapları kabul etmelisin.
katma yazar Mark Ingram, kaynak

3 cevap

Ayarlayana kadar " NULL " durumunda kalır. Bu deyimi kullanabilirsiniz:

optional funct1(const string& key) {
 //use iterator to look for key in a map
  optional ret; 
  if (iterator != map.end()) 
  {
    ret =  it->second;
  }

  return ret;
}

Sonra:

if (!funct1(key)) { /* no value */ }
14
katma

Soruya geçmeden önce birkaç şeyden söz edeyim.

Dize her zaman bulunmalıysa (programlayıcı hatası değilse), isteğe bağlı olarak kullanmak yerine kullanamazsanız, muhtemelen atmanız gerekir. Kullanıcı girişi olsa bile, yakalamayı/atmayı denemek isteyebilirsiniz.

Sınıfınız konteynır gibi konteynırı taklit ediyorsa, bulunmadığını belirtmek için bir end sentinel kullanmayı düşünmelisiniz, null değil.

If however returning a null representation is what you're after, your function return type would be boost::optional and the null return would be return boost::none;.

3
katma
Merhaba Mark B. - Neden geri dönüşü tavsiye etmiyorsunuz? Bir fark var mı? Varsa, profesyonel kod ayarında hangisi tercih edilir? Kodumun diğer kullanıcıların kullanabileceği bir kütüphane olması amaçlanmış, bu nedenle kullanıcı girdisine büyük ölçüde dayanan kodda daha çok tercih edilmeli/yakalanmalı/atılmalı mıdır? Teşekkürler.
katma yazar czchlong, kaynak
Ayrıca boost :: none kullanmanızı öneririm, çünkü okunabilirliği artırır (bence).
katma yazar Luc Touraille, kaynak

Bunu dene:

int funct1(const string& key)
{
 //use iterator to look for key in a map
  if(iterator == map.end())
    return boost::optional();
  else
    return boost::optional(it->second);
}

void funct2(string key)
{
  const boost::optional result = funct1(key);
  if (result.is_initialized())
  {
   //Value exists (use result.get() to access it)
  } 
  else
  {
   //Value doesn't exist
  }
}

Ayrıca işleri kolaylaştırmak için şablonu da yazdım:

typedef boost::optional OptionalInt;
1
katma
Boost.Optional belgeleri, is_initialized öğesinin kullanımdan kaldırıldığını; bunun yerine bool dönüşüm işlecini kullanın (ör. if (sonuç) {...} ). Ayrıca, funct1 dönüş türünüz int olmamalıdır.
katma yazar ildjarn, kaynak