variant_hash

variant_hash (std::variant를 위한 std::hash 전문화)

이 페이지는 std::variant 타입에 대한 std::hash 전문화를 설명해요. 이 전문화를 사용하면 variant 객체의 해시 값을 얻을 수 있어요. 특정 조건에서만 활성화되며, 멤버 함수들은 noexcept가 보장되지 않아요.

출처: cppreference

본문

std::variant 템플릿에 대한 std::hash의 템플릿 전문화는 사용자가 variant 객체의 해시를 얻을 수 있게 해줘요.

이 전문화 std::hash<std::variant<Types...>>std::hash<std::remove_const_t<Types>>...의 모든 전문화가 활성화되어 있을 때만 활성화되고(see std::hash), 그렇지 않으면 비활성화돼요.

이 전문화의 멤버 함수들은 noexcept가 보장되지 않아요.

템플릿 매개변수

Types - variant 객체가 지원하는 대안(alternative)들의 타입

참고 사항

std::hash<std::optional>과 달리 variant의 해시는 일반적으로 포함된 값의 해시와 같지 않아요. 이를 통해 동일한 값을 서로 다른 대안으로 보관하는 std::variant<int, int>를 구별할 수 있어요.

예제

#include <iostream>
#include <string>
#include <variant>

using Var = std::variant<int, int, int, std::string>;

template<unsigned I>
void print(Var const& var)
{
    std::cout << "get<" << var.index() << "> = "
              << std::get<I>(var)
              << "\t" "# = "
              << std::hash<Var>{}(var) << '\n';
}

int main()
{
    Var var;
    std::get<0>(var) = 2020;
    print<0>(var);
    var.emplace<1>(2023);
    print<1>(var);
    var.emplace<2>(2026);
    print<2>(var);
    var = "C++";
    print<3>(var);
}

가능한 출력:

get<0> = 2020   # = 2020
get<1> = 2023   # = 2024
get<2> = 2026   # = 2028
get<3> = C++    # = 15518724754199266859

같이 보기

hash (C++11) 해시 함수 객체 (클래스 템플릿) [edit]

더 알아보기 (Learn more)

cppreference