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). Для объекта optional, не содержащего значения, хеш не определён.
Не гарантируется, что функции-члены этой специализации не выбрасывают исключений, поскольку хеш базового типа может выбросить исключение.
Параметры шаблона
| 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/cpp/utility/optional/hash