Bietet C ++ 11 Hash-Funktionen für std :: type_info?

7

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?

    
Billy ONeal 23.08.2010, 22:16
quelle

2 Antworten

9

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>     

James McNellis 23.08.2010, 22:32
quelle
10

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.

    
Fericelli 19.11.2012 15:32
quelle