我希望在外部类中有一个内部类,并让外部类将内部类放入一个哈希表中。实现这一目标的明智方法是什么?我的尝试是:
#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;
}不起作用,因为std::hash专门化不是由我试图声明类外部的unordered_set字段定义的。
发布于 2019-03-27 06:00:56
我不确定这算不算“理智”,但这是我想到的第一个想法。
您可以创建一个自定义散列类,将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上是这样的,否则它拒绝工作。
https://stackoverflow.com/questions/55366680
复制相似问题