为什么 std::hash 不专用于 std::reference_wrapper?
Why is std::hash not specialised for std::reference_wrapper?
我以为会是这样,但我在我的标准库实现 (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());
}
};
}
std::reference_wrapper
主要用于在默认复制值的实用程序中提供引用语义,例如 std::bind
.
在容器中直接使用std::reference_wrapper
本质上就像一个指针(除了它不可为空)。指针(和智能指针)的散列遵循引用(即地址)语义。
当然,您始终可以提供自己的哈希函数。如果您将其定义为所有指针和智能指针的模板,那么 T*
可能是比 reference_wrapper<T>
.
更好的值类型选择
请注意,如果您已经对对象进行哈希处理并存储了哈希值,则可以通过将所有内容保存在 unordered_map
中来消除重复项。然后值标识和对象标识将相同。
我以为会是这样,但我在我的标准库实现 (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());
}
};
}
std::reference_wrapper
主要用于在默认复制值的实用程序中提供引用语义,例如 std::bind
.
在容器中直接使用std::reference_wrapper
本质上就像一个指针(除了它不可为空)。指针(和智能指针)的散列遵循引用(即地址)语义。
当然,您始终可以提供自己的哈希函数。如果您将其定义为所有指针和智能指针的模板,那么 T*
可能是比 reference_wrapper<T>
.
请注意,如果您已经对对象进行哈希处理并存储了哈希值,则可以通过将所有内容保存在 unordered_map
中来消除重复项。然后值标识和对象标识将相同。