Як выкарыстоўваць павышэнне :: апцыянальны <T>, каб вярнуцца NULL ў C ++?

У мяне ёсць функцыя, якая павінна вяртаць NULL ў некаторых выпадках і ёсць яшчэ адна функцыя, якая павінна праверыць вяртаецца значэнне гэтай функцыі. Я ведаю павышэнне :: неабавязковага, але я не ведаю, як выкарыстоўваць сінтаксіс.

Ніжэй будзе прыведзены просты прыклад выкарыстання названага:

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
  }

Можа хто-то калі ласка, дапамажыце з сінтаксісам?

Дзякуючы.

9
Вы задалі 10 пытанняў і прыняў 0 адказаў. Вы павінны вярнуцца і прыняць правільныя адказы.
дададзена аўтар Mark Ingram, крыніца

3 адказы

Ён застаецца ў « NULL " стане, пакуль вы не ўсталюеце яго. Вы можаце выкарыстоўваць гэтай ідыёмы:

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

тады:

if (!funct1(key)) { /* no value */ }
14
дададзена

Назаву некалькі рэчаў, перш чым патрапіць на гэтае пытанне.

Калі радок заўсёды павінна быць знойдзена (памылка праграміста, калі гэта не так), вы павінны, верагодна, кінуць, калі ён не можа быць замест таго, каб выкарыстоўваць апцыянальны. Вы нават можаце паспрабаваць/злавіць/выкінуць, нават калі гэта карыстацкі ўвод.

Калі пераймае клас кантэйнера як семантыкі, вы павінны разгледзець магчымасць выкарыстання канец дазорцы, каб паказаць, што ён не быў знойдзены, а не нулявы.

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
дададзена
Прывітанне Марк Б. - Чаму вы рекомендуете ня вяртаецца наддув :: ні ў той час як іншыя аддаюць перавагу проста вяртаюцца апцыянальным сам? Ці ёсць розніца? Калі ёсць, што адзін з'яўляецца пераважным ў прафесійнай ўстаноўцы кода? Мой код прызначаны для бібліятэкі, якія могуць выкарыстоўваць іншыя карыстальнікі, так бы паспрабаваць/злавіць/кідок быць больш пераважным ў кодзе, які ў значнай ступені залежыць ад карыстацкага ўводу? Дзякуючы.
дададзена аўтар czchlong, крыніца
Я таксама рэкамендаваў бы выкарыстаць падштурхоўвання :: NONE , так як гэта павышае чытальнасць (на мой погляд).
дададзена аўтар Luc Touraille, крыніца

Паспрабуйце гэта:

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

Я хацеў бы таксама вызначэнне тыпу ць шаблон, каб зрабіць рэчы прасцей:

typedef boost::optional OptionalInt;
1
дададзена
Дакументацыя Boost.Optional кажа, што is_initialized з'яўляецца састарэлым; выкарыстоўвайце BOOL Аператар пераўтварэнні замест (напрыклад, , калі (вынік) {...} ). Акрамя таго, ваш funct1 які вяртаецца тып не павінен быць Int .
дададзена аўтар ildjarn, крыніца