2011-10-21 11 views
6

あるとき、私は問題を抱えていること、私はこのようなものを使用する場合:私は何も値が見つからない時に返すために何を知らない「が見つかりません」どのように戻るには、戻り値はconst参照

const MyList& my_list = getListForThisRegion(/*region ID, ...*/); 

を。

私の問題は、(値を返すときにgetListForThisRegionから)「値が見つかりません」という信号を呼び出し側に送信する方法がありたいということです。ポインタを返すと、私はnullptrを返すことができましたが、参照でそれを行う方法はわかりません。私が考えることができるのは、MyListの静的メンバーnot_foundを持っていて、そのリファレンスを返していますが、醜いようです。

そして、リストは "太って"よく使われるので、値を返すことはできません。

EDIT:すばらしい答えのトンですが、発生する回数が多い(パーセントがnbNotFound/nbCalls)ため、例外は許容される解決策ではありません。
EDIT2:boost :: optionalについて - どのように複雑にマスターするのですか?私はそれがいくつかの非自明な知識(非明白=単に構文を知っていない何か)を必要とするのかどうか?

+3

例外をスローするといいでしょう。 – BigMike

+1

'boost :: optional'を参照することもできます – Akanksh

+0

リファレンスはオブジェクトを参照する必要があるため、例外をスローするか参照を使用しないでください。 'boost :: optional'は素晴らしい選択ですが、それは過度のものかもしれません。ポインタを使用するだけです。 – GManNickG

答えて

7

これを処理するには、2つの慣用的な方法があります。

    は何もない(nullにすることができ、例えば、ポインタ、 endにイテレータ)を参照する機能を持つ型を返すために、あなたのインターフェイスを変更し

それとも

  • アイテムが見つからない場合に例外をスローします。ダミーオブジェクトを返す

ビットハックで、あなたはまだ特別な値(nullまたはダミーオブジェクト)に対する結果を確認する必要があるとして、あなたはポインタを返すの上に何かを得ることはありません。

+3

'boost :: optional'は良いタイプです。 –

+0

@ edA-qamort-ora-y:これは、参照ではなく値で返されるセマンティクスを変更します(オプションの参照を返さない限り、ポインタに何が追加されているか分かりません)。 –

+0

@Mike: 'boost :: optional >'について教えてください。 @MikeSeymour、 – fredoverflow

1

私は例外クラス(必要に応じて階層)を書き、そのような場合の例外をスローします。

1

私は、インスタンスが「null」(設定されていない)と宣言しているMyListクラスの特別なメンバーを持っているか、例外をスローする可能性があります。

+1

null値を示すためにメンバを 'MyList'に持つことは非常に邪魔に思えます。この種の機能は、オブジェクトを別のオブジェクトにラップすることでよりよく達成されることがよくあります。 'Boost.Optional 'は、null可能オブジェクトを表すためのラッパーを提供します。 –

1

あなたはstd::mapの鉛に続き、あなたのコンテナに既定の構成リストを挿入し、その参照を返すことができます。明らかに、これは既定のリストとそこにないリストとの間に意味の違いがないことに依存します。

特定の領域を検索するクエリ関数を追加し、リストがある場合はtrueを返し、そうでない場合はfalseを返すこともできます。次に、一般的な発生ではないことを知って、アクセサー・セーフに例外をスローすることができます。

3

返すようにリストを置く "returnValue"を参照する関数を書き直すのはどうですか?関数は、見つかった/見つからなかったことを示すブール値を返すことができます。

bool getListForThisRegion(/*region ID, ...*/, MyList& ret_list); 
関連する問題