Namespaces
Variants

std:: hash <std::optional>

From cppreference.net
Utilities library
Definiert im Header <optional>
template < class T >
struct hash < std:: optional < T >> ;
(seit C++17)

Die Template-Spezialisierung von std::hash für die std::optional Klasse ermöglicht es Benutzern, Hashwerte der in optional Objekten enthaltenen Werte zu erhalten.

Die Spezialisierung std::hash < std:: optional < T >> ist aktiviert (siehe std::hash ), wenn std:: hash < std:: remove_const_t < T >> aktiviert ist, und andernfalls deaktiviert.

Wenn aktiviert, ergibt sich für ein Objekt o vom Typ std:: optional < T > , das einen Wert enthält, std::hash < std:: optional < T >> ( ) ( o ) denselben Wert wie std:: hash < std:: remove_const_t < T >> ( ) ( * o ) . Für ein optional, das keinen Wert enthält, ist der Hash nicht spezifiziert.

Die Memberfunktionen dieser Spezialisierung sind nicht garantiert noexcept, da der Hash des zugrundeliegenden Typs möglicherweise eine Exception wirft.

Template-Parameter

T - der Typ des in optional enthaltenen Werts

Beispiel

#include <iostream>
#include <optional>
#include <string>
#include <unordered_set>
using namespace std::literals;
int main()
{
    using OptStr = std::optional<std::string>;
    // hash<optional> ermöglicht die Verwendung von 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';
}

Mögliche Ausgabe:

def     11697390762615875584
(null)  18446744073709548283
abc     3663726644998027833
ABC     11746482041453314842

Siehe auch

(C++11)
Hash-Funktionsobjekt
(Klassentemplate)