23

私が理解していることから、結果を返さないことがある関数を実装できる 2* の方法があります (たとえば、ppl のリストで見つかった人)。

*- raw ptr バージョンを無視し、bool フラグとペアにし、バージョンが見つからない場合は例外とします。

boost::optional<Person> findPersonInList();

また

std::unique_ptr<Person> findPersonInList();

では、どちらかを優先する理由はありますか?

4

7 に答える 7

26

それは異なります:ハンドルまたはコピーを返しますか。

ハンドルを返したい場合:

  • Person*
  • boost::optional<Person&>

どちらも許容される選択肢です。nullアクセスの場合にスローするクラスを使用する傾向がありPtr<Person>ますが、それは私のパラノイアです。

コピーを返却したい場合:

  • boost::optional<Person>非ポリモーフィック クラスの場合
  • std::unique_ptr<Person>ポリモーフィック クラス用

動的割り当てにはオーバーヘッドが発生するため、必要な場合にのみ使用します。

于 2013-01-16T14:46:13.127 に答える
14

一般的な答えは、あなたの意図はboost::optionalではなく によって表現されているということstd::unique_ptrです。とはいえ、操作の特殊なケースは、基になる型に反復子の概念があると仮定して、おそらく標準ライブラリの方法に準拠する必要があります。要素が見つからない場合はfind反復子を返し、それ以外の場合は要素に反復子を返します。end()

于 2013-01-16T14:43:24.763 に答える
8

boost::optionalより明確にあなたの意図を述べます。空std::unique_ptrは返す値がないことを意味することを明示的に文書化する必要があります

于 2013-01-16T14:40:40.823 に答える
6

それを行う 4 番目の方法があります。何も見つからない場合、関数が例外をスローするようにします。

これがあなたの質問に実際に答えていないことはわかっているので、申し訳ありませんが、あなたはそれについて考えていなかったかもしれません.

于 2013-01-16T14:39:51.713 に答える
5

ああ、ゼオはまだ現れなかったの?

ええと、これは一度話しましたが、もう一度言います。これら 2 つは、目的が異なる完全に異なるオブジェクトです。

  • unique_ptr、私がオブジェクトを所有していることを意味します。「私は物である」の言い方が違うだけです。したがって、nullunique_ptrは注目を集めることができるものです。オブジェクトを期待していましたが、何も得られませんでした。コードが間違っているに違いありません!
  • optionalは、初期化されない場合があることを意味しますが、それは問題ありません。この場合、心配はありません。である場合None、それは考えられている動作です。

どちらも暗黙的に bool に変換されるという事実は、それらが交互に使用できるという意味ではありません。optional出力を生成しない可能性が高いコード (ストリームの読み取りなど) で使用します。unique_ptrファクトリ オブジェクトで使用します。ほとんどの場合、オブジェクトが作成されますが、作成されない場合は例外がスローされます。

あなたの例に関する結論:find返すべきoptionalです。

于 2013-01-16T14:46:11.850 に答える
1

では、どちらかを優先する理由はありますか?

それらは非常に異なる意図を表現optionalしています。関数が結果を返さない可能性があることを示しています(これはエラーの場合ではありません)。unique_ptr所有権のセマンティクスについて説明します (エラーを表現するために、null と一緒に使用する方がより受け入れられます)。

通常、インターフェイスの背後にある意図を最もよく表すものを使用します。

たとえば、受信したバッファを HTTP 要求オブジェクトに解析しようとする HTTP サーバーを作成しているとします。不完全なバッファを解析しようとしても、エラーは発生しません。待機してさらにデータをバッファリングしてから、再試行する必要があります。

関数が何も返さない可能性があることを明確にするために、これを , を使用して表現しoptionalます (何も返さないことはエラーケースではありません)。

解析で何かを検証する必要がある場合 (たとえば、解析された式が無効な正規表現である場合、正規表現パーサーはエラーを生成する必要があります)、 null を返すか、できればunique_ptr例外をスローします。

于 2013-01-16T15:02:13.360 に答える