Non C ++ 11 forniscono funzioni per std :: type_info hashing?
-
30-09-2019 - |
Domanda
Sto ancora lavorando su una buona soluzione al mio One-Of-a-Type container problema - e riflettendoci penso che sarebbe bello essere in grado di utilizzare solo qualcosa di simile a un std::map<std::type_info, boost::any>
. Purtroppo, std::type_info
non definisce un operator<
, e penso che sarebbe irragionevole per poter definire uno.
Tuttavia, sembra ragionevole definire una funzione di hash per questo, perché si può semplicemente utilizzare l'indirizzo Singleton dell'oggetto std::type_info
come un "hash" ragionevole. Pertanto, si sarebbe in grado di mettere un std::type_info
in un std::unordered_map
come la chiave.
Il C ++ 11 forniscono tale funzione hash una? Sarebbe utilizzando l'indirizzo di memoria della std::type_info
Singleton essere una strategia hash cattivo?
Soluzione
Il fatto che type_info
non è minore di simili non è tanto un problema per il suo utilizzo come chiave mappa come il fatto che type_info
non è copiabile. : -)
In C ++ 03, type_info
ha una funzione membro before()
che fornisce un ordinamento di oggetti type_info
.
In C ++ 11, type_info
ha una funzione membro hash_code()
(C ++ 11 §18.7.1 / 7):
size_t hash_code() const throw();
Returns: un valore fi cato non specificata, tranne che all'interno di una singola esecuzione del programma, si tornerà lo stesso valore per ogni coppia di oggetti
.type_info
che risultano ugualiNota:. un'implementazione deve restituire valori diversi per due oggetti
type_info
che non risultano uguali
type_info
oggetti risultanti dalla esistono operatore typeid
fino alla fine del programma, quindi è sicuro da usare un type_info*
come chiave mappa. Tuttavia, per quanto di mia conoscenza, non v'è alcuna garanzia che se si applica typeid
a due oggetti dello stesso tipo si ottengono due riferimenti allo stesso oggetto type_info
.
Se si utilizza type_info*
come chiave mappa, userei un comparatore personalizzato che dereferenziazioni i puntatori e confronta stessi oggetti del type_info
(utilizzando il già citato before()
o hash_code()
per l'ordinazione).
Altri suggerimenti
Si potrebbe anche usare type_index , tiene in modo sicuro un puntatore ad un type_info, è copiabile, paragonabile e una funzione di hash è previsto per contenitori standard.