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] |
|---|