如何声明哈希函数以在命名空间内的unordered_set中使用?

Ste*_*eve 2 c++ hash

我已成功==为自定义类创建了一个哈希函数(和覆盖),因此我可以在一个中使用它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();
    }
};
Run Code Online (Sandbox Code Playgroud)

但是,MyClass在自定义命名空间中声明.我认为使用全局范围解析运算符::,但这不起作用:

namespace mine {
    // ...

    template<>
    struct ::std::hash<MyClass> {
        // ...
    };
}
Run Code Online (Sandbox Code Playgroud)

所以,似乎我希望在命名空间的封闭括号内有一些东西声明要在另一个命名空间中.写下最后一句话让我意识到这可能是不可能的,但是在类哈希函数附近使用哈希函数的想法似乎是一个好主意.

这可能吗?这是什么最好的做法?

Pra*_*ian 5

正如您所发现的,如果您想为其添加特殊化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;
Run Code Online (Sandbox Code Playgroud)

你也可以创建一个typedefunordered_set自己节省一些打字.