std::hash<std::optional>
Материал из cppreference.com
Определено в заголовочном файле <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>usingnamespace std::literals;int main(){using OptStr =std::optional<std::string>; // hash<optional> позволяет использовать unordered_setstd::unordered_set<OptStr> s ={"ABC"s, "abc"s, std::nullopt, "def"s }; for(constauto& o : s){std::cout<< o.value_or("(null)")<<'\t'<<std::hash<OptStr>{}(o)<<'\n';}}
Возможный вывод:
def 11697390762615875584 (null) 18446744073709548283 abc 3663726644998027833 ABC 11746482041453314842
[править]Смотрите также
(C++11) | Объект хеш-функции (шаблон класса) |