質問

データ構造クラスのハッシュテーブルを作成しています。実装に少し構文的な砂糖を追加したいと思います。

template <typename HashedObj, typename Object>
Object & Dictionary<HashedObj, Object>::operator[](HashedObj & key)
{
  return items.lookup(key);
}

cout <!> lt; <!> lt;のようなことをするとうまく動作します。 dict [<!> quot; mykey <!> quot;]。 しかし、括弧で割り当てを行うにはどうすればよいですか次のようなもの:

dict["mykey"] = "something";

いいえ、これは私の宿題の一部ではありません(しゃれは意図していません)。C++をもう少しよく学びたいです。

役に立ちましたか?

解決

ここで何を尋ねているのかは明確ではありません。提示したコードはすでに割り当てをサポートしています。それを実行するだけで動作します(または少なくともコンパイルする必要があります)。オーバーロードされた[]が割り当て演算子のどちらの側で使用されるかはまったく違いはありません。割り当ての右側(RHS)と同じように(または元の投稿のように<<のオペランドとして)左側(LHS)でもまったく同じように機能します。 Objectlookupへの参照を返し、実際の割り当てはNULLタイプの割り当て演算子によって処理されます。つまり、std::map自体は実際の割り当てに実際には関与しません。

ここでの本当の質問は、特定の特殊なケースでconst HashedObj&をどのように動作させるかです。キーがテーブルにない場合はどうなりますか?この場合、HashedObjは何を返すのでしょうか?

投稿内容を把握することはできません。参照を返すので、<=>を返すのは問題ありません。指定されたキーに新しい空の<=>を挿入しますか?もしそうなら、あなたは何もする必要はありません。 <=>は、割り当てのLHSで使用するための準備が整っています。 (これが<=> in <=>の仕組みです、ところで)

<=>が特別な<!> quot; guard <!> quot;への参照を返す場合<=>、特別な手順を実行する必要があります。おそらく<!> quot; guard <!> quot;には何も割り当てたくないでしょう。オブジェクトなので、<!> quot; disable <!> quot;その代入演算子がなんとかして完了です。残りはそのまま動作するはずです。

存在しないキーの場合に<=>が例外をスローする場合、<=>が割り当てのLHSで使用されるときにこれが望ましいものであるかどうかを決定する必要があります。もしそうなら、あなたは何もする必要はありません。そうでない場合は、追加の作業が必要になります...

では、存在しないキーを<=>に渡すとどうなりますか?

PSさらに、通常は、<=>パラメーターまたは単に<=>パラメーターで<=>(および<=>)を宣言する方が適切です。あなたの例のように、非定数参照は奇妙に見え、いくつかの(実際には、ほとんどの)場合に問題を引き起こす可能性があります。私はそれが今あなたのために働いていることに驚いています...

他のヒント

それを2回オーバーロードする必要があります。 constになる部分はdata access部分になり、参照を返すものは<!> quot; setter <!> quot;として機能します。

探しているのは、std::mapのオーバーロードされたブラケット演算子に似た機能です。 std::map<K,V> mymapでは、ブラケット演算子が検索を実行し、特定のキーに関連付けられたオブジェクトへの参照を返します。マップにキーに関連付けられたオブジェクトが含まれていない場合、オペレーターはデフォルトコンストラクターを使用して新しいオブジェクトをマップに挿入します。

したがって、mymap[someKey]がある場合、someKeyを呼び出すと、Vに関連付けられた値への参照が返されるか、V()を呼び出して<=>型の新しいオブジェクトが作成されます( V)のデフォルトコンストラクター)を呼び出し、その新しいオブジェクトへの参照を返します。これにより、呼び出し元はオブジェクトに値を割り当てることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top