std::hash<std::optional>
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <optional>
|
||
template< class T > struct hash<std::optional<T>>; |
(начиная с C++17) | |
Специализация шаблона std::hash для класса std::optional позволяет пользователям получать хэши значений, содержащихся в объектах optional.
Специализация std::hash<optional<T>> доступна (смотрите std::hash), если доступна std::hash<std::optional<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> позволяет использовать 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) |
Объект хеш-функции (шаблон класса) |