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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top