std::hash<std::optional>
Определено в заголовке <optional> | ||
|---|---|---|
template< class T > struct hash<std::optional<T>>; | (с C++17) |
Шаблонная специализация std::hash для класса std::optional позволяет пользователям получать хэши значений, содержащихся в объектах optional.
Специализация std::hash<std::optional<T>> включена (см. std::hash) если std::hash<std::remove_const_t<T>> включено, и отключена в противном случае.
При включении, для объекта o типа std::optional<T>, содержащего значение, std::hash<std::optional<T>>()(o) вычисляется так же, как и std::hash<std::remove_const_t<T>>()(*o). Для опционального значения, которое не содержит значение, хэш не определен.
Члены-функции этой специализации не гарантированно являются 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
См. также
|
(C++11) | функция хэширования (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/optional/hash