小编vam*_*si3的帖子

如何部分专门化 std::hash 模板?

假设我们有一段代码如下

#include <list>
#include <string>
#include <unordered_map>

int main() {
    std::list<int> myList = {4, 1, 3, 2};
    std::unordered_map<std::list<int>::iterator, std::string> myMap;
    myMap[myList.begin()] = "first element";
}
Run Code Online (Sandbox Code Playgroud)

这段代码本身不起作用,因为我们必须为 定义一个模板专门化std::hash,如下所示

template<>
class std::hash<std::list<int>::iterator> {
public:
    size_t operator()(std::list<int>::iterator const& it) const noexcept {
        return hash<int*>()(&*it);
    }
};
Run Code Online (Sandbox Code Playgroud)

这效果很好。

但是当我尝试概括它并定义以下内容时,

template<typename T>
class std::hash<std::list<T>::iterator> {
public:
    size_t operator()(std::list<T>::iterator const& it) const noexcept {
        return hash<T*>()(&*it);
    }
};
Run Code Online (Sandbox Code Playgroud)

我再次从编译器中看到静态断言失败。为什么这不起作用,定义std::hash任何列表迭代器的正确方法是什么?


编译器详细信息
  • g++(海湾合作委员会)13.2.1 20230801
  • -std=c++23标志(C++23 标准)

c++ template-specialization stdhash c++23

1
推荐指数
1
解决办法
142
查看次数

标签 统计

c++ ×1

c++23 ×1

stdhash ×1

template-specialization ×1