boost :: optional <T>を使ってC ++でNULLを返すには?

場合によってはNULLを返さなければならない関数があり、この関数の戻り値をテストする必要がある別の関数があります。 boost :: optionalを認識していますが、構文の使い方がわかりません。

以下は、上記の使用法の簡単な例です。

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
追加された

私が質問に達する前にいくつか言及しましょう。

文字列が常に見つかるはずなら(プログラマーエラーでない場合)、オプションの文字列を使用する代わりに使用できない場合は、おそらく投げてください。たとえそれがユーザーの入力であっても、キャッチ/スローしたいと思うかもしれません。

あなたのクラスがセマンティクスのようなコンテナを模倣している場合は、 end のセンチネルを使用してnullが見つからなかったことを示すことを検討する必要があります。

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
追加された
こんにちはマークB. - 他の人が単にオプションのものを返すのを好む一方、なぜboost :: noneを返すことをお勧めしますか?違いはありますか?もしあれば、どちらがプロのコード設定で好まれますか?私のコードは、他のユーザーが使用できるライブラリを意図しているので、ユーザーの入力に大きく依存するコードでは、キャッチ/スローを優先しますか?ありがとう。
追加された 著者 czchlong,
boost :: 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して、物事をより簡単にする:

typedef boost::optional OptionalInt;
1
追加された
Boost.Optionalのドキュメントによると、 is_initialized は非推奨です。代わりに bool 変換演算子を使用します(例: if(result){...} )。また、 funct1 の戻り値の型は int であってはなりません。
追加された 著者 ildjarn,