std::hash<std::variant>
From cppreference.com
| ヘッダ <variant> で定義 |
||
| template< class... Types > struct hash<std::variant<Types...>>; |
(C++17以降) | |
テンプレート std::hash の std::variant テンプレートに対する特殊化により、ユーザーは variant オブジェクトのハッシュ値を取得できます。
特殊化 std::hash<std::variant<Types...>> は、std::hash<std::remove_const_t<Types>>... のすべての特殊化が有効である場合(std::hash を参照)、有効になり、それ以外の場合は無効になります。
この特殊化のメンバ関数は noexcept であることが保証されていません。
目次 |
[編集] テンプレートパラメータ
| 型 | - | variant オブジェクトによってサポートされる代替型の型 |
[編集] 注記
std::hash<std::optional> とは異なり、variant のハッシュ値は通常、格納されている値のハッシュ値とは等しくありません。これにより、std::variant<int, int> が同じ値を持っていても、異なる代替として区別することが可能になります。
[編集] 例
このコードを実行
#include <iostream> #include <string> #include <variant> using Var = std::variant<int, int, int, std::string>; template<unsigned I> void print(Var const& var) { std::cout << "get<" << var.index() << "> = " << std::get<I>(var) << "\t" "# = " << std::hash<Var>{}(var) << '\n'; } int main() { Var var; std::get<0>(var) = 2020; print<0>(var); var.emplace<1>(2023); print<1>(var); var.emplace<2>(2026); print<2>(var); var = "C++"; print<3>(var); }
実行結果の例
get<0> = 2020 # = 2020 get<1> = 2023 # = 2024 get<2> = 2026 # = 2028 get<3> = C++ # = 15518724754199266859
[編集] 関連項目
| (C++11) |
ハッシュ関数オブジェクト (クラステンプレート) |