C ++ da NULLni qaytarish uchun boost :: opsiyonel <T> qanday foydalaniladi?

Ba'zi hollarda NULLni qaytarish kerak bo'lgan funktsiyam bor va bu funksiyaning qaytish qiymatini tekshirish uchun boshqa funktsiya mavjud. Boost: :: ixtiyoriy, lekin sintaksisini qanday ishlatishni bilmayman.

Quyida aytilgan foydalanishning oddiy misoli bo'lishi mumkin:

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
  }

Kimdir sintaksisga yordam berishi mumkinmi?

Rahmat.

9
Siz 10 savolni bergansiz va 0 ta javobni qabul qildingiz. Orqaga qaytib, to'g'ri javoblarni qabul qilishingiz kerak.
qo'shib qo'ydi muallif Mark Ingram, manba

3 javoblar

Siz o'rnatmaguningizgacha " NULL " holatida qoladi. Siz bu iboradan foydalanishingiz mumkin:

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;
}

Keyin:

if (!funct1(key)) { /* no value */ }
14
qo'shib qo'ydi

Savolga kirishdan oldin bir nechta narsalarni eslayman.

Agar mag'lubiyat har doim ham topilgan bo'lsa (dasturchi xatosi bo'lmasa) siz ixtiyoriy ravishda foydalanish o'rniga bo'lmasa, uni tashlab qo'yishingiz kerak. Hatto foydalanuvchi kiritgan bo'lsa ham, sinash/tutish/tashlashni xohlashingiz mumkin.

Agar sinfingiz semantika kabi konteynerni taqlid qilsa, u topilmasa, null emasligini ko'rsatish uchun end sentineldan foydalaning.

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
qo'shib qo'ydi
Xristian Mark B. - Nima uchun boshqalar o'z ixtiyoriga o'zi qaytib kelishni afzal ko'radilar? Farqi bormi? Agar mavjud bo'lsa, qanday professional kod sozlamalari afzal ko'riladi? Mening kodim boshqa foydalanuvchilarning foydalanishi mumkin bo'lgan kutubxona bo'lishi uchun mo'ljallangan, shuning uchun kodni kodni ishlatib, foydalanuvchi kiritishda ko'proq afzalroq deb bilasizmi? Rahmat.
qo'shib qo'ydi muallif czchlong, manba
Bundan tashqari, boost :: none dan foydalanishni tavsiya qilaman, chunki u o'qiydiganlikni oshiradi (mening fikrimcha).
qo'shib qo'ydi muallif Luc Touraille, manba

Buni ko'ring:

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
  }
}

Bundan tashqari, shablonni yozishni osonlashtiraman:

typedef boost::optional OptionalInt;
1
qo'shib qo'ydi
Boost.Optional hujjatida is_initialized ishlatilmayapti; uning o'rniga bool o'tkazish operatoridan foydalaning (masalan, if (result) {...} ). Bundan tashqari, funct1 qaytish turini int bo'lishi kerak.
qo'shib qo'ydi muallif ildjarn, manba