Ho iniziato a utilizzare la classe dallo spazio dei nomi tr1
per accelerare l'accesso rispetto allo STL semplice (basato su albero) map
. Tuttavia, volevo memorizzare i riferimenti all'ID thread in boost (boost::thread::id
) e mi sono reso conto che l'API di quegli identificatori è così opaca da non poter ottenere chiaramente un hash di esso.tr1 :: hash per boost :: thread :: id?
Sorprendentemente, spinta implementa parti del tr1
(tra cui hash
e unordered_set
), ma non definisce una classe hash che è in grado di hash un ID di thread.
Guardando la documentazione dei boost::thread::id
ho trovato che gli ID di thread possono essere inviati a un ruscello, così la mia soluzione per fare hashing stato un po ':
struct boost_thread_id_hash
{
size_t operator()(boost::thread::id const& id) const
{
std::stringstream ostr;
ostr << id;
std::tr1::hash<std::string> h;
return h(ostr.str());
}
};
Cioè, serializzare esso, si applicano l'hash al stringa risultante. Tuttavia, questo sembra essere meno efficiente rispetto all'utilizzo effettivo dell'STL map<boost::thread::id>
.
Quindi, le mie domande: trovate un modo migliore per farlo? È una chiara incoerenza sia in boost che in tr1 di non forzare l'esistenza di una classe hash<boost::thread::id>
?
Grazie.
+1 e grazie per la risposta. In realtà, penso che sia il migliore di tutti, quindi lo accetterò. Non sono sicuro di come "standard" 'native_handle' e il relativo' native_handle_type' sarebbe a lungo termine. Sembra probabile che l'hashing 'thread :: id' possa essere incluso in un tempo ragionevole in boost, in quanto c'era qualche rapporto con TR1 per non averlo neanche se ricordo bene ... In sintesi: grazie, non l'ho fatto pensa a 'native_handle_type'. –