所以我使用的库有一个枚举(假设它被命名为 LibEnum
)。我需要一个 std::unordered_set
的 LibEnum
,但我得到编译错误,没有专门的 std::hash
。我可以很容易地编写它并只返回值的数量(第一个元素是 0,第二个元素是 1 等),但是我应该把这个特化放在哪里,它应该是什么样子?我无法修改库源。
enum LibEnum { A, B, C, D};
std::unordered_set <LibEnum> mySet;
//need std::hash for LibEnum
//how should it look like?
最佳答案
你可以专攻std::hash
适合你的类型:
namespace std {
template <>
struct hash<FullyQualified::LibEnum> {
size_t operator ()(FullyQualified::LibEnum value) const {
return static_cast<size_t>(value);
}
};
}
或者,您可以定义一个 hash
在你喜欢的地方输入,并在实例化时将其作为附加模板参数提供 std::unordered_map<FooEnum>
:
// Anywhere in your code prior to usage:
struct myhash {
std::size_t operator ()(LibEnum value) const {
return static_cast<std::size_t>(value);
}
};
// Usage:
std::unordered_map<LibEnum, T, myhash> some_hash;
这两种方法都不需要您修改库。
关于c++ - 如何将 std::hash 专门化为来自其他库的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14813965/