std::hash<std::optional>
From cppreference.com
| ヘッダ <optional> で定義 |
||
| template< class T > struct hash<std::optional<T>>; |
(C++17以降) | |
std::hash の std::optional クラスに対するテンプレート特殊化により、ユーザーは 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
[編集] 関連項目
| (C++11) |
ハッシュ関数オブジェクト (クラステンプレート) |