std::hash<std::optional>
ja.cppreference.net より
| ヘッダ <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 の場合、ハッシュは未規定です。
この特殊化のメンバ関数は、基礎となる型のハッシュが例外を送出する可能性があるため、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)
|
ハッシュ関数オブジェクト
(クラステンプレート) |