为什么要在hash<int>()(foo)的中间添加额外的括号
Why adding extra parentheses in the middle of hash<int>()(foo)
我正在尝试使我的一个类可哈希,并看到以下内容:如何为无序容器中的用户定义类型专门化std::hash
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>(...)
?
有几个原因,最值得注意的是,您可以部分专攻类模板;您只能完全专攻函数模板。
它也是惯用的,有许多标准库算法和容器期望类型的行为类似于函数,但可能并不总是函数。函子的使用允许这样做。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- 2D数组来自文本输入,中间有空格
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 我正在尝试在字符数组的中间添加一个空格.不确定如何正确移动它
- 在数组的中间添加新索引
- 为什么要在hash<int>()(foo)的中间添加额外的括号
- 单链表在中间添加节点
- 如何在不丢失数据的情况下向矢量中间添加一些内容
- 添加带有链表的中间节点