optional_hash
optional_hash (std::optional 해시)
이 페이지는 std::optional에 대한 std::hash 템플릿 특수화를 다루고 있어요. 이 특수화를 사용하면 optional 객체에 저장된 값의 해시를 얻을 수 있고, optional을 unordered_set이나 unordered_map의 키로 사용할 수 있게 돼요. 해시는 optional이 값을 포함하지 않을 때도 정의되지만 그 값은 지정되지 않아요.
출처: cppreference
본문
정의
<optional> 헤더에 정의되어 있으며, C++17부터 사용할 수 있어요.
template < class T > struct hash < std :: optional < T >> ;
설명
std::optional 클래스에 대한 std::hash 템플릿 특수화는 사용자가 optional 객체에 포함된 값의 해시를 얻을 수 있게 해줘요.
std::hash < std :: optional < T >> 특수화는 std :: hash < std :: remove_const_t < T >>가 활성화되어 있으면 활성화되고(std::hash 참고), 그렇지 않으면 비활성화돼요.
활성화된 경우, 값을 포함하는 std :: optional < T > 타입의 객체 o에 대해 std::hash < std :: optional < T >> ()( o )는 std :: hash < std :: remove_const_t < T >> ()( * o )와 같은 값으로 평가돼요. 값을 포함하지 않는 optional의 해시는 지정되지 않아요.
이 특수화의 멤버 함수는 기반 타입의 해시가 예외를 던질 수 있기 때문에 noexcept가 보장되지 않아요.
템플릿 매개변수
| T | - | optional 객체에 포함된 값의 타입 |
|---|
예제
#include <iostream>
#include <optional>
#include <string>
#include <unordered_set>
using namespace std::literals;
int main()
{
using OptStr = std::optional<std::string>;
// hash<optional> makes it possible to use unordered_set
std::unordered_set<OptStr> s =
{
"ABC"s, "abc"s, std::nullopt, "def"s
};
for (const auto& o : s)
std::cout << o.value_or("(null)") << '\t' << std::hash<OptStr>{}(o) << '\n';
}
가능한 출력
def 11697390762615875584
(null) 18446744073709548283
abc 3663726644998027833
ABC 11746482041453314842
같이 보기
- hash (C++11) - 해시 함수 객체 (클래스 템플릿)