名前空間
変種
操作

std::hash <std::optional>

提供: cppreference.com
< cpp‎ | utility‎ | optional
 
 
 
 
ヘッダ <optional> で定義
template<class T>
struct hash<std::optional<T>>;
(C++17以上)

テンプレート std::hashstd::optional クラスに対する特殊化は、ユーザが optional オブジェクトに格納されている値のハッシュを取ることを可能とします。

特殊化 std::hash<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 <optional>
#include <unordered_set>
#include <string>
#include <iostream>
using namespace std::literals;
int main()
{
    // hash<optional> makes it possible to use unordered_set
    std::unordered_set<std::optional<std::string>> s = {
            "abc"s, std::nullopt, "def"s
    };
 
    for(const auto& o : s)
        std::cout << o.value_or("(null)") << ' ';
}

出力例:

def abc (null)

[編集] 関連項目

(C++11)
ハッシュ関数オブジェクト
(クラステンプレート) [edit]