Ich arbeite immer noch an einer guten Lösung für meine One-of-a-Type-Container-Problem - und wenn ich darüber nachdenke, wäre es schön, einfach so etwas wie std::map<std::type_info, boost::any>
verwenden zu können. Leider definiert std::type_info
kein operator<
, und ich denke, dass es unangemessen wäre, eins zu definieren.
Es erscheint jedoch sinnvoll, eine Hash-Funktion dafür zu definieren, weil Sie einfach die Singleton-Adresse des std::type_info
-Objekts als vernünftigen "Hash" verwenden können. Daher könntest du std::type_info
in einen std::unordered_map
als Schlüssel setzen.
Bietet C ++ 11 eine solche Hash-Funktion? Würde die Verwendung der Speicheradresse von std::type_info
singleton eine schlechte Hash-Strategie sein?
Die Tatsache, dass type_info
nicht kleiner als vergleichbar ist, ist nicht so sehr ein Problem für die Verwendung als ein Kartenschlüssel als die Tatsache, dass type_info
nicht kopierbar ist. : -)
In C ++ 03 hat type_info
eine before()
-Memberfunktion, die eine Anordnung von type_info
-Objekten bereitstellt.
In C ++ 11 hat type_info
eine hash_code()
-Memberfunktion (C ++ 11 §18.7.1 / 7):
%Vor%Gibt: einen nicht spezifizierten Wert zurück, außer dass es innerhalb einer einzigen Ausführung des Programms den gleichen Wert für zwei
type_info
-Objekte zurückgibt, die gleich sind.Bemerkung: eine Implementierung sollte verschiedene Werte für zwei
type_info
-Objekte zurückgeben, die nicht gleich sind.
type_info
-Objekte, die aus dem typeid
-Operator resultieren, existieren bis zum Ende des Programms, so dass es sicher ist, ein type_info*
als Map-Schlüssel zu verwenden. Nach meinem besten Wissen gibt es jedoch keine Garantie dafür, dass Sie, wenn Sie typeid
auf zwei Objekte desselben Typs anwenden, zwei Referenzen auf dasselbe type_info
-Objekt erhalten.
Wenn Sie type_info*
als Map-Schlüssel verwenden, würde ich einen benutzerdefinierten Vergleicher verwenden, der die Zeiger dereferenziert und die type_info
-Objekte selbst vergleicht (unter Verwendung der oben genannten before()
oder hash_code()
für die Bestellung) / p>
Sie könnten auch type_index verwenden, es enthält sicher einen Zeiger auf ein type_info, es ist kopierbar, vergleichbar und eine Hash-Funktion wird für Standardcontainer bereitgestellt.
Tags und Links c++ c++11 rtti unordered-map typeinfo