2011-10-27 10 views
9

私は場合によってはNULLを返さなければならない関数を持っていますが、この関数の戻り値をテストする必要がある別の関数があります。 boost :: optionalを認識していますが、構文の使い方がわかりません。boost :: optional <T>を使用して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の回答を受け入れました。あなたは戻って正しい答えを受け入れるべきです。 –

答えて

14

設定するまで「NULL」の状態のままです。あなたはこのイディオムを使用することができます。

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

    return ret; 
} 

その後:

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

はこれを試してみてください:

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

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

私も物事を簡単にするために、テンプレートをtypedefのでしょう:

typedef boost::optional<int> OptionalInt; 
+5

Boost.Optionalのドキュメントでは、 'is_initialized'は非推奨です。代わりに 'bool'変換演算子を使用してください(例えば' if(result){...} ')。また、 'funct1'の戻り値の型は' int'であってはいけません。 – ildjarn

3

私がクールに行く前にいくつか言及しましょうestion。

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

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

null表現を返すのは、あなたの後ろのものであれば、関数の戻り値の型はboost::optional<int>になり、null戻り値はreturn boost::none;になります。

+1

こんにちはマークB. - なぜあなたはboost :: noneを返すことをお勧めしますか?違いはありますか?もしあれば、どちらがプロのコード設定で好まれますか?私のコードは、他のユーザーが使用できるライブラリを意図しているので、ユーザーの入力に大きく依存するコードでは、キャッチ/スローを優先しますか?ありがとう。 – czchlong

+0

私は 'boost :: none'を使うことをお勧めします。なぜなら、読みやすさが向上するからです(私の意見では)。 –

関連する問題