io condividere qui dal momento che può essere utile ad altri che cercano per questa soluzione: a partire da @KarlvonMoor risposta, ecco una versione modello variadic, che è terser nel suo utilizzo, se è necessario combinare diversi valori insieme:
inline void hash_combine(std::size_t& seed) { }
template <typename T, typename... Rest>
inline void hash_combine(std::size_t& seed, const T& v, Rest... rest) {
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
hash_combine(seed, rest...);
}
Usage:
std::size_t h=0;
hash_combine(h, obj1, obj2, obj3);
Questo è stato scritto in origine per realizzare una macro variadic per rendere facilmente i tipi personalizzati hashable (che credo sia uno degli usi primari di una funzione hash_combine
):
#define MAKE_HASHABLE(type, ...) \
namespace std {\
template<> struct hash<type> {\
std::size_t operator()(const type &t) const {\
std::size_t ret = 0;\
hash_combine(ret, __VA_ARGS__);\
return ret;\
}\
};\
}
Usage:
struct SomeHashKey {
std::string key1;
std::string key2;
bool key3;
};
MAKE_HASHABLE(SomeHashKey, t.key1, t.key2, t.key3)
// now you can use SomeHashKey as key of an std::unordered_map
fonte
2016-07-01 08:46:24
Possibile duplicato di [Come specializzare std :: hash per tipi definiti dall'utente?] (Https://stackoverflow.com/questions/24361884/how-to-specialize-stdhasht-for-user-defined-types) –
Raedwald
Una specializzazione di 'std :: hash' deve necessariamente combinare il sub h ceneri dei membri dei dati. Tutte le prove e i ragionamenti applicati si applicano ad una funzione 'hash_combine'. – Raedwald
@Raedwald Vedo ora che quella era una delle sue sottoquestioni, ma per essere onesti, la sua domanda è periferica e indiretta. Aggiungi la tua risposta qui se hai qualcosa da aggiungere. –