unordered_map
-
Hallo!
Ich arbeite zur Zeit mit der unordered_map aus (dem) TR1. Diese hat zwar den
Tvalue & operator[] (const Tkey & Key)jedoch nicht auch noch in einer const-Version. So dass ich const Klassenreferenzen nicht verwenden kann.
Kann ich nun ohne Probleme bei/mit der Vererbung eine neue Klasse erstellen, die von unordered_map erbt und den operator[] zusätzlich als const implementiert?
// Zur Vereinfachung auf die vielen Template-Parameter verzeichtet class MyMap : public unordered_map<Tkey, Tvalue, ...> { public: // Die const-Version const Tvalue & operator [] (const Tkey & Key) const { // Implementation } };
-
Du würdest mit const-Indizierung aber die Semantik von Container Map (bzw. unordered-map) ändern. Durch den Index-Operator werden nämlich ein Key-Value-Paar erstellt, falls der angefragte Key noch nicht existiert... und damit kann die map nicht const sein.
Insofern wenn, dann private Ableitung.
-
Oh, daran habe ich gar nicht gedacht.
-
Ich kenne die Map ausm TR1 nicht, aber in der stl::map ist der const-Zugriff mit "map::find" möglich. Ist hier evtl genauso?
-
Ja, ist möglich!
-
Pellaeon schrieb:
Ich kenne die Map ausm TR1 nicht, aber in der stl::map ist der const-Zugriff mit "map::find" möglich. Ist hier evtl genauso?
Hmm, also könnte ich dann den Operator mit unordered_map::find als const implementieren in der abgeleiteten Klasse.
-
Könntest du sicher, aber willst du wirklich die Logik verändern? Es gibt ja einen Unterschied. "operator[]" liefert mir IMMER ein Objekt (Exception-Fall mal ausgenommen). Wenn kein Objekt mit dem Schlüssel vorhanden ist, wird eins angelegt. "find" dagegen liefert end(), wenn der Schlüssel nicht existiert.
-
Pellaeon schrieb:
Könntest du sicher, aber willst du wirklich die Logik verändern? Es gibt ja einen Unterschied. "operator[]" liefert mir IMMER ein Objekt (Exception-Fall mal ausgenommen). Wenn kein Objekt mit dem Schlüssel vorhanden ist, wird eins angelegt. "find" dagegen liefert end(), wenn der Schlüssel nicht existiert.
Falls ich diesen Operator wirklich als const-Version bräuchte, werde ich ihn wohl mit find überladen. Falls find() dann end() liefert, werfe ich eine Ausnahme.
Danke Euch.