假设我们有一段代码如下
#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任何列表迭代器的正确方法是什么?
-std=c++23标志(C++23 标准)