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()

더 알아보기 (Learn more)

cppreference