How to specialize std::hash for type from other library
Asked Answered
S

1

2

So the library I use has an enum (say it's named LibEnum). I need to have an std::unordered_set of LibEnum, but I get compilation error that there is no specialized std::hash for it. I could easily write it and just return the number of value (first element is 0, second 1 etc), but where exactly I should put this specialization and how should it look like? I can't modify the library sources.

  enum LibEnum { A, B, C, D};
  std::unordered_set <LibEnum> mySet;
  //need std::hash for LibEnum
  //how should it look like?
Seedcase answered 11/2, 2013 at 14:23 Comment(3)
As you using an enum this document describes the extensions to enums introduced in c++11 (just incase you are unware).Learning
@Learning interesting read, thanks.Seedcase
Possible duplicate of How to specialize std::hash<Key>::operator() for user-defined type in unordered containers?Nimbus
B
8

You can just specialise std::hash for your type:

namespace std {
    template <>
    struct hash<FullyQualified::LibEnum> {
        size_t operator ()(FullyQualified::LibEnum value) const {
            return static_cast<size_t>(value);
        }
    };
}

Alternatively, you can define a hash type where ever you like and just provide it as the additional template argument when instantiating 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;

Neither methods require you to modify the library.

Byelaw answered 11/2, 2013 at 14:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.