Namespaces
Variants

std:: hash <std::variant>

From cppreference.net
Utilities library
헤더 파일에 정의됨 <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)
해시 함수 객체
(클래스 템플릿)