我正在为 pair < int,int >
键。
总之,我发现下面的实现使用了 std::hash<>
:
typedef struct hasher_t {
template <class T1, class T2>
size_t operator()(const pair<T1,T2>& key) const {
//standard hasher for T1, T2
auto h1 = std::hash<T1>()(key.first); //also possible
auto h2 = std::hash<T2>()(key.second); //also possible
/*
auto h1 = std::hash<T1>{}(key.first);
auto h2 = std::hash<T2>{}(key.second);
*/
return h1 ^ (h2 - 1);
}
} hasher;
std::hash<T1>()
和 std::hash<T1>{}
都可以,但我不知道为什么会这样。
我甚至找不到这方面的参考文章。
我猜他们两个都为类做了字面意义上的 "未命名的时间实例"。std::hash<T1>
,并调用 operator()(T1)
方法。这样做对吗?
std::hash<T>
是一个类型而不是一个函数.你可以把它看成是一个 向量. 所以你必须创建一个它的实例。
回答你的问题,是的,这两种方式都可以使一个对象的 std::hash<T>
并初始化它,调用 ()
操作符。
std::hash<T1>()
使用括号进行初始化。它也被称为 值初始化.
std::hash<T1>{}
是使用大括号进行初始化。在 auto h1 = std::hash<T1>{}(key.first);
事实是 {}
的实例,创建一个 std::hash<T1>
然后 (key.first)
话务员 ()
在你的实例上。这也就是所谓的 集合初始化 或 列表初始化.
在C++11及以后的版本中,你可以使用std::hash{}。(即用大括号代替括号)来建立一个对象。