c++ - 如何将 std::hash 专门化为来自其他库的类型

标签 c++ hash stl unordered-set stdhash

所以我使用的库有一个枚举(假设它被命名为 LibEnum)。我需要一个 std::unordered_setLibEnum,但我得到编译错误,没有专门的 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/

相关文章:

c++ - 无需 iTunes 即可直接将音乐上传至 iPhone/iPod/...

c++ - STL - 在 <algorithm> 中使用成员函数或函数?

c++ - 无法删除 std::vector & std::array?

c++ - 尝试对 vector 进行复制构造

c++ - 尽管有很强的依赖类,但设计灵活

c++ - 反转散列(查找冲突)

hash - 如何按出现的顺序获取哈希键

php: 只有数字哈希?

c++ - 为什么 std::rotate 这么快?

c++ - 从 UPDATE 查询中获取 'Cannot insert duplicate key'