unique_ptr_hash
unique_ptr_hash (std::hashstd::unique_ptr)
<memory> 헤더에 정의되어 있어요. std::unique_ptr<T, Deleter>에 대한 std::hash의 특수화로, std::unique_ptr<T, Deleter> 타입 객체의 해시를 얻을 수 있게 해줘요. C++11부터 도입됐어요.
출처: cppreference
본문
template< class T, class Deleter >
struct hash<std::unique_ptr<T, Deleter>>;
(C++11부터)
std::unique_ptr<T, Deleter>에 대한 std::hash의 템플릿 특수화는 사용자가 std::unique_ptr<T, Deleter> 타입 객체의 해시를 얻을 수 있게 해줘요.
std::hash<typename std::unique_ptr<T,D>::pointer>가 활성화되어 있으면 std::hash<std::unique_ptr<T,D>> 특수화도 활성화되고, 그렇지 않으면 비활성화돼요.
활성화되었을 때, 주어진 std::unique_ptr<T, D> p에 대해 이 특수화는 std::hash<std::unique_ptr<T, D>>()(p) == std::hash<typename std::unique_ptr<T, D>::pointer>()(p.get())을 보장해요. 즉 unique_ptr의 해시는 그 저장된 포인터의 해시와 같아요.
이 특수화의 멤버 함수는 포인터가 fancy pointer일 수 있고 그 해시가 던질 수 있으므로 noexcept가 보장되지 않아요.
예제
#include <functional>
#include <iostream>
#include <memory>
struct Foo
{
Foo(int num) : nr(num) { std::cout << "Foo(" << nr << ")\n"; }
~Foo() { std::cout << "~Foo()\n"; }
bool operator==(const Foo &other) const { return nr == other.nr; };
int nr;
};
int main()
{
std::cout << std::boolalpha << std::hex;
Foo* foo = new Foo(5);
std::unique_ptr<Foo> up(foo);
std::cout << "hash(up): " << std::hash<std::unique_ptr<Foo>>()(up) << '\n'
<< "hash(foo): " << std::hash<Foo*>()(foo) << '\n'
<< "*up==*foo: " << (*up == *foo) << "\n\n";
std::unique_ptr<Foo> other = std::make_unique<Foo>(5);
std::cout << "hash(up): " << std::hash<std::unique_ptr<Foo>>()(up) << '\n'
<< "hash(other): " << std::hash<std::unique_ptr<Foo>>()(other) << '\n'
<< "*up==*other: " << (*up == *other) << "\n\n";
}
가능한 출력:
Foo(5)
hash(up): acac20
hash(foo): acac20
*up==*foo: true
Foo(5)
hash(up): acac20
hash(other): acbc50
*up==*other: true
~Foo()
~Foo()