5

キーでインデックス付けされたオブジェクトを格納するマップに似た単純なコンテナクラスをC++で記述しています。次のようなアクセサ機能を提供したいのですが。

V& getValue(const K &key);

ここで、値への参照を返します。

しかし、キー/値が存在せず、ユーザーに何らかのステータスを返すことができる場合にも対処したいと思いました(ステータスタイプを介して発信者に連絡したい理由がいくつかある可能性があります) )。

私は次のことができると思いますが、これを呼び出すには、この関数を呼び出す前にVオブジェクトを構築する必要があり、内部Vオブジェクトを参照によって渡されるオブジェクトにコピーするだけなので、それは悪いようです。

Status getValue(const K &key, V& v);

私もできます:

V &getValue(const K &key, Status &s);

しかし、何らかの理由で、ステータスからフォーカスが外れ、ユーザーがステータスを確認するのを忘れる可能性があるため、少し不格好に思えます(ただし、それは私の問題ではないかもしれません)。

それで、とにかく似たような機能を持つことはありますか

Status getValue(const K &key, V& v);

ダミーのVオブジェクトを呼び出す前に構築する必要がありませんか?参照を参照に渡すことはできません。ポインタを使用できて満足していると思いますが、使いやすく、関数についての理由を作成するのはあまり望ましくありません。

何かご意見は?

4

7 に答える 7

2

通常の解決策は、bool contains(const K &key)関数を提供することです。アクセサーにエントリを黙って作成させたくない場合は、代わりに例外をスローさせます。(例外をスローするアクセサーと、エントリを作成するアクセサーの 2 つを持つことも一般的です)

もちろん、これはあなたが望むものではないかもしれません。これらすべてを単一の関数に収めたい理由は何ですか?

于 2012-08-15T14:25:44.020 に答える
2

元の関数V& getValue(const K &key)を使用して、例外をスローして、失敗したStatus値を示すことができます。

次に、呼び出し元は、問題の処理方法を遅らせるオプションがあります (例外を適切なハンドラーにバブルアップさせることにより)。ただし、そうしないとプログラムがクラッシュするため、完全に忘れることはできません。呼び出しサイトは、ステータス チェックおよびエラー報告コードでごちゃごちゃしている必要はありません。

于 2012-08-15T14:35:13.400 に答える
1

boost::optionalブーストを使用したくない場合は、同様のテンプレートを使用するか作成します。関数を使用boost::optionalすると、次のようになります。

boost::optional<MyClass &> getValue(const K &key)
于 2012-08-15T14:19:34.303 に答える
1

3 つのオプションが表示されます。

  1. V& に変換でき、有効な参照を格納しているかどうかを判断できる「ラッパー」オブジェクトを返します (V* の周りに実装できます)。
  2. ポインターを返します。
  3. キーが見つからない場合は参照を返し、例外をスローします。

私は個人的にはポインターを使います。

于 2012-08-15T14:25:09.173 に答える
0

boost::variant<V &, Status>または (同等)を返すことを検討してくださいboost::variant<std::reference_wrapper<V>, Status>

于 2012-08-15T14:22:53.977 に答える
0

最初に、あなたの質問に書かれているとおりに答えますboost::optional<boost::ref<V> >。参照によって戻ることができるように、 a を返すことをお勧めしますが、オプションでそうすることもできます。

ただし、このインターフェイスはお勧めしません。標準コンテナには、この問題を正確に解決するインターフェース、つまり値ではなくイテレータを返すインターフェースがすでにあります。「イテレーター」インターフェースを使用し (実際の本格的なイテレーターである必要はありません)、end参照によって返すかどうかではなく、イテレーターが見つからないことを示すために末尾を過ぎた /one を返すことをお勧めします。コンテナのインターフェースを標準のコンテナのように見せるほど、標準のアルゴリズムを使用し、代わりに必要な場所にプラグインするオプションが増えます。

于 2012-08-15T14:58:17.823 に答える
0

std::map インターフェイスからのアイデアに従います。

std::pair<iterator,bool> getValue(const K& key);

値オブジェクトはイテレータを介してアクセスでき、boolフラグは値が存在するかどうかを示します。

于 2012-08-15T14:25:49.123 に答える