2

したがって、私が使用するライブラリには列挙型があります(名前はLibEnum)。のが必要ですstd::unordered_setLibEnum、専用ではないというコンパイルエラーが発生しますstd::hash。簡単に記述して値の数(最初の要素は0、2番目の要素は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 に答える