c++ - 为什么 std::hash 是结构而不是函数?

标签 c++ c++11 std c++-standard-library stdhash

标准库将 std::hash 实现为专门用于不同类型的模板结构。它是这样使用的:

#include <iostream>
#include <functional>

int main()
{
    std::hash<int> hasher;
    std::cout << hasher(1337) << std::endl;

    return 0;
}

我的问题是这种设计选择背后的原因是什么。为什么它没有作为模板函数实现并像这样使用:

#include <iostream>
#include <functional>

int main()
{
    std::cout << std::hash<int>(1337) << std::endl;

    return 0;
}

最佳答案

有多种原因,每一个都足以选择:

  1. 您可以部分特化类模板,但只能完全特化函数模板(至少到目前为止)。因此,您可以用std::hash<T> 替换整套相关模板参数。作为类模板。请注意,部分重载无济于事,因为需要以某种方式将哈希函数指定为无法通过重载函数完成的对象(除非它们是通过对象访问的,但这就是区别所在)。
  2. 无序关联容器使用静态实体参数化(如果特定类型支持,也可以动态自定义),使用类模板更容易完成。
  3. 由于用于散列函数的实体是可自定义的,因此可以选择使用类型或函数指针进行自定义。函数指针通常很难内联,而一个类型的内联成员函数内联是微不足道的,从而大大提高了简单函数(例如计算简单哈希)的性能。

关于c++ - 为什么 std::hash 是结构而不是函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20179767/

相关文章:

c++ - Constexpr 类采用 const 引用未编译

c++ - const_cast 设置规则并为函数 const 打破它

c++ - 常用符号 '\pS' 不是 'matched' 使用 std::wregex

C++ vector 源代码

c++ - 在成员函数的参数列表中查找名称

c++ - 内存模型和并发

c++ - 为什么这个无操作循环没有被优化掉?

c++ - 如何编写以对象为参数的可变参数模板函数?

c - 为什么 getopt_long 会忽略一些命令行选项

C++时间添加+超时检测