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?

È stato utile?

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 uguali

.      

Nota:. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top