Rachus: Wann ist ein const_cast angebracht?

Beitrag lesen

Hallo,

mit schluessel meinst du iterator, oder? ein iterator ist ja praktisch schon sowas wie ein pointer, sodass du durch die zusatzlichen pointers eigentlich keine speicherersparnis bekommst.

Nun das wäre theoretisch tatsächlich so, wenn ich nicht das Problem gehabt hätte, dass ich dann meiner Hasher und Equaler-Funktion einerseits Pointer und andererseits Iteratoren hätte übergeben müssen. Wenn das geht, klärt mich bitte auf, aber ich habe es vorerst so gelöst, dass ich einen Pointer (als Schlüssel) und einen Iterator (mit als Wert) speichere:

std::list<Key> identifiers;
std::unordered_multimap<Key*, std::pair<class std::list<Key>::iterator, Value>, Hasher, Equaler> data;

Der operator() meines Hashers und Equalers sieht dabei übrigens so aus:

template<class Key, class Value, class Hash, class Equals>
inline size_t
UM_Wrapper<Key, Value, Hash, Equals>::Hasher::operator()
(const Key* const key) const
{
return hasher(*key);
}

template<class Key, class Value, class Hash, class Equals>
inline bool
UM_Wrapper<Key, Value, Hash, Equals>::Equaler::operator()
(const Key* const first, const Key* const second) const
{
return equaler(*first, *second);
}

wenn du einfach iterators und const_iterators statt pointers (auf die iterators) verwenden wuerdest, haettest du das problem nicht, oder verstehe ich dich falsch?

Das war allerdings nicht mein Problem. Eigentlich ging es mir darum, dass die Funktion key_exists (und eigentlich auch alle anderen Funktionen, die einen Lookup in der Hashtabelle machen) (siehe mein erster Beitrag) nicht kompiliert, wenn ich nicht den key const_caste. Ist hier mein Konzept kaputt, oder ist const_cast für genau solche Fälle gedacht?
Vielleicht habe ich dich aber hier auch selbst falsch verstanden. Meine Klasse zeigt nämlich Iteratoren gar nicht nach außen hin. Sie verwendet diese eigentlich nur intern, weswegen es nicht in Frage kam, komplett auf Iteratoren umzusteigen.

Grüße,

Rachus