2

所以我使用的库有一个枚举(比如说它的名字LibEnum)。我需要一个std::unordered_setof 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?
4

1 回答 1

8

您可以专门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;

这两种方法都不需要您修改库。

于 2013-02-11T14:27:28.317 回答