我已经成功地为自定义类创建了一个散列函数(和 ==
覆盖),因此我可以在 unordered_set
中使用它。但是,理想情况下,我想在要使用的类附近为我的类定义模板特化。这可以通过以下方式完成,效果很好:
class MyClass {
public:
MyClass() { _id = _nextId++; }
const int id() const { return _id; }
private:
int _id;
static int _nextId;
};
int MyClass::_nextId = 0;
template<>
struct std::hash<MyClass> {
std::size_t operator()(const MyClass& k) const {
return k.id();
}
};
但是,MyClass
是在自定义命名空间中声明的。我认为使用全局范围解析运算符 ::
,但这不起作用:
namespace mine {
// ...
template<>
struct ::std::hash<MyClass> {
// ...
};
}
所以,我似乎想在一个命名空间的大括号内声明一些东西在另一个命名空间中。写下最后一句话让我意识到这可能是不可能的,但是将哈希函数放在它正在哈希的类附近的想法似乎是个好主意。
这可能吗?这方面的最佳做法是什么?
最佳答案
如您所见,如果您想为 std::hash
添加特化,则必须在 std
命名空间内完成。如果这是不可取的,另一种选择是将哈希仿函数保留在您的命名空间中,并将其作为模板参数传递给 unordered_set
。
namespace mine {
class MyClass { ... };
struct MyClass_hash {
std::size_t operator()(const MyClass& k) const {
return k.id();
}
};
}
std::unordered_set<mine::MyClass, mine::MyClass_hash> my_set;
您还可以为 unordered_set
创建一个 typedef
以节省您自己的输入时间。
关于c++ - 如何声明一个哈希函数以用于命名空间内的 unordered_set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22796594/