Namespaces
Variants

std::hash<std::variant>

cppreference.net에서 발췌
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
Swap 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
헤더 <variant>
template< class... Types >
struct hash<std::variant<Types...>>;
에 정의됨 (C++17부터)

std::hash 템플릿의 std::variant에 대한 특수화는 사용자가 variant 객체의 해시를 얻을 수 있게 합니다.

특수화 std::hash<std::variant<Types...>>는 std::hash 참조) std::hash<std::remove_const_t<Types>>...의 모든 특수화가 활성화된 경우에만 활성화되며, 그렇지 않으면 비활성화됩니다.

이 특수화의 멤버 함수는 noexcept가 보장되지 않습니다.

템플릿 매개변수

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

참고 사항

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

참고 항목

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