内部可哈希类声明失败

时间:2019-03-26 21:47:07

标签: c++

我想在一个外部类的内部有一个内部类,并且让外部类将该内部类放入一个哈希表中。实现这一目标的理智方法是什么? 我的尝试:

#include <unordered_set>

class Outer {
public:
  struct Inner {
    int x;
  };

  std::unordered_set<Outer::Inner> inners;
};

namespace std {
  template<> struct hash<Outer::Inner> {
    size_t operator()(const Outer::Inner& o) {
      return 42;
    }
  };
}

int main() {
  Outer outer;
  std::unordered_set<Outer::Inner> inners;
  return 0;
}

不起作用,因为我尝试声明Outer类的unordered_set字段的关系没有定义std :: hash专门化。

1 个答案:

答案 0 :(得分:1)

不确定这是否算是“理智”,但这是我想到的第一个想法。

您可以创建一个自定义哈希类,将operator()调用转发到目标对象的成员函数(在下面的实现中为.hash())。

#include <cstddef>
#include <unordered_set>

struct member_hash {
  template <typename T> std::size_t operator()(const T &o) const {
    return o.hash();
  }
};

class Outer {
public:
  struct Inner {
    int x;
    std::size_t hash() const {
      return 42;
    }
  };

  std::unordered_set<Outer::Inner, member_hash> inners;
};

int main() {
  Outer outer;
  std::unordered_set<Outer::Inner, member_hash> inners;
  return 0;
}

还请注意,哈希类的operator()应该为const,至少在我的GCC上,它拒绝进行其他工作。