Does C ++ 11 bieten Hashing-Funktionen für std :: type_info?
-
30-09-2019 - |
Frage
Ich arbeite immer noch auf eine gute Lösung für mein One-Of-A-Typ Container Problem - und bei der Reflexion denke ich, es wäre schön, die Lage sein, nur die Verwendung so etwas wie ein std::map<std::type_info, boost::any>
. Leider std::type_info
definieren keine operator<
, und ich denke, es unvernünftig wäre für sie eine definieren.
Allerdings ist es sinnvoll scheint eine Hash-Funktion für sie zu definieren, weil Sie einfach die Singleton-Adresse des std::type_info
Objekts als vernünftig „hash“ verwenden könnten. Daher würden Sie in der Lage sein, eine std::type_info
in eine std::unordered_map
als Schlüssel zu setzen.
Does C ++ 11 liefern eine solche Hash-Funktion? Würde die Speicheradresse des std::type_info
mit Singletons eine schlechte Hash-Strategie sein?
Lösung
Die Tatsache, dass type_info
ist nicht weniger als vergleichbare ist nicht so sehr ein Problem für sie als Mapkey wie die Tatsache, dass mit type_info
nicht kopierbar ist. : -)
In C ++ 03, type_info
hat eine before()
Member-Funktion, die eine Anordnung von type_info
Objekten.
In C ++ 11, type_info
hat eine hash_code()
Memberfunktion (C ++ 11 §18.7.1 / 7):
size_t hash_code() const throw();
Returns: ein unspezi fi ziert Wert, außer dass in einer einzigen Ausführung des Programms, so hat er den gleichen Wert für zwei beliebige
.type_info
Objekte zurück, die gleich vergleichen. Hinweis: eine Implementierung unterschiedliche Werte für zwei
type_info
Objekte zurückgeben soll, die nicht gleich vergleichen
type_info
Objekte aus dem typeid
Operator exist bis zum Ende des Programms, so dass es sicher ist, ein type_info*
als Kartenschlüssel zu verwenden. Um jedoch die besten meines Wissens gibt es keine Garantie, dass, wenn Sie typeid
auf zwei Objekte des gleichen Typs gelten Sie zwei Referenzen auf dasselbe Objekt type_info
bekommen.
Wenn Sie type_info*
als Mapkey tun, würde ich einen benutzerdefinierten Komparator verwenden, dass Dereferenzierungen die Zeiger und vergleicht die type_info
Objekte selbst (die zuvor erwähnte before()
oder hash_code()
für die Bestellung verwendet wird).
Andere Tipps
Sie könnten auch verwenden type_index , es sicher einen Zeiger auf eine type_info hält, es ist kopierbar, vergleichbar und eine Hash-Funktion ist für die Standard-Container vorgesehen.