为什么要在hash<int>()(foo)的中间添加额外的括号

Why adding extra parentheses in the middle of hash<int>()(foo)

本文关键字:添加 中间 foo int hash gt 为什么 lt      更新时间:2023-10-16

我正在尝试使我的一个类可哈希,并看到以下内容:如何为无序容器中的用户定义类型专门化std::hash::operator()?

namespace std {
  template <> struct hash<Foo>
  {
    size_t operator()(const Foo & x) const
    {
      /* your code here, e.g. "return hash<int>()(x.value);" */
    }
  };
}

使用上面的代码,一切正常。但我正试图更好地理解这种机制。

为什么我们必须在中间添加一对额外的括号hash<int>()(...)?它看起来很丑。为什么我们不能设计它,让它只是hash<int>(...)

为什么我们必须在中间添加一对额外的括号hash<int>()(...)

hash<int>是一个类,因此它需要一个类的实例,然后才能应用调用运算符,因此;

hash<int>()

例如,并且;

hash<int>()(...) 

叫它。

为什么我们不能设计它,让它只是hash<int>(...)

有几个原因,最值得注意的是,您可以部分专攻类模板;您只能完全专攻函数模板。

它也是惯用的,有许多标准库算法和容器期望类型的行为类似于函数,但可能并不总是函数。函子的使用允许这样做。