11

そうだろうと思ったのですが、標準ライブラリの実装 (gcc-4.8.2) でこれを見つけることができません。

なぜstd::hashまだ専門化されていないのstd::reference_wrapperですか?

#pragma once
#include <functional>

namespace std 
{
    template<typename T>
    struct hash<reference_wrapper<T>>
    {
        size_t operator()(const reference_wrapper<T>& r) const
        {
            return std::hash<T>()(r.get());
        }
    }; 
}
4

1 に答える 1

3

std::reference_wrapperは主に、デフォルトで値をコピーするユーティリティ ( など) で参照セマンティクスを提供するために使用されますstd::bind

コンテナー内での as の直接使用はstd::reference_wrapper、基本的にはポインターに似ています (ただし、null 許容ではない点が異なります)。ポインター (およびスマート ポインター) のハッシュは、参照 (アドレス) セマンティクスに従います。

もちろん、いつでも独自のハッシュ関数を提供できます。すべてのポインターとスマート ポインターに対してテンプレートとして定義する場合T*は、reference_wrapper<T>.

すでにオブジェクトをハッシュしてハッシュを保存している場合は、すべてをunordered_map. その場合、値 ID とオブジェクト ID は同じになります。

于 2015-05-01T06:21:17.843 に答える