#include <iostream>
#include <unordered_set>
struct test
{
std::size_t hashCode() const
{
return 0;//insert your has routine
}
};
//helper class
struct hashable
{
hashable():value(0){}
template<typename T>
hashable(const T& t):value(t.hashCode())
{}
template<typename T>
std::size_t operator()(const T& t) const
{
return t.hashCode();
}
std::size_t value;
};
//hash specialization of hashable
namespace std {
template<>
struct hash<hashable>
{
typedef hashable argument_type;
typedef std::size_t result_type;
result_type operator()(const argument_type& b) const {
return b.value;
}
};
}
//helper alias so you dont have to specify the hash each time.
template<typename T, typename hash = hashable>
using unordered_set = std::unordered_set<T,hash>;
int main(int argc, char** argv)
{
unordered_set<test> s;
test t;
std::cout<<std::hash<hashable>{}(t)<<std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KCnN0cnVjdCB0ZXN0CnsKICAgIHN0ZDo6c2l6ZV90IGhhc2hDb2RlKCkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gMDsvL2luc2VydCB5b3VyIGhhcyByb3V0aW5lCiAgICB9Cn07Ci8vaGVscGVyIGNsYXNzCnN0cnVjdCBoYXNoYWJsZQp7CiAgICBoYXNoYWJsZSgpOnZhbHVlKDApe30KICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBoYXNoYWJsZShjb25zdCBUJiB0KTp2YWx1ZSh0Lmhhc2hDb2RlKCkpCiAgICB7fQogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgVCYgdCkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gdC5oYXNoQ29kZSgpOwogICAgfQoKICAgIHN0ZDo6c2l6ZV90IHZhbHVlOwp9OwoKCi8vaGFzaCBzcGVjaWFsaXphdGlvbiBvZiBoYXNoYWJsZQpuYW1lc3BhY2Ugc3RkIHsKICAgIHRlbXBsYXRlPD4KICAgIHN0cnVjdCBoYXNoPGhhc2hhYmxlPgogICAgewogICAgICAgIHR5cGVkZWYgaGFzaGFibGUgYXJndW1lbnRfdHlwZTsKICAgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHJlc3VsdF90eXBlOwogICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgYXJndW1lbnRfdHlwZSYgYikgY29uc3QgewogICAgICAgICAgICByZXR1cm4gYi52YWx1ZTsKICAgICAgICB9CiAgICB9Owp9Ci8vaGVscGVyIGFsaWFzIHNvIHlvdSBkb250IGhhdmUgdG8gc3BlY2lmeSB0aGUgaGFzaCBlYWNoIHRpbWUuCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIGhhc2ggPSBoYXNoYWJsZT4KdXNpbmcgdW5vcmRlcmVkX3NldCA9IHN0ZDo6dW5vcmRlcmVkX3NldDxULGhhc2g+OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQp7CiAgICB1bm9yZGVyZWRfc2V0PHRlc3Q+IHM7CiAgICB0ZXN0IHQ7CiAgICBzdGQ6OmNvdXQ8PHN0ZDo6aGFzaDxoYXNoYWJsZT57fSh0KTw8c3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0K