Sci*_*llo 18 c++ std c++-standard-library c++11 stdhash
标准库将std :: hash实现为专门用于不同类型的模板结构.它是这样使用的:
#include <iostream>
#include <functional>
int main()
{
std::hash<int> hasher;
std::cout << hasher(1337) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是这种设计选择背后的原因是什么.为什么它没有实现为模板函数并像这样使用:
#include <iostream>
#include <functional>
int main()
{
std::cout << std::hash<int>(1337) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Die*_*ühl 17
有多种原因,每种原因都足以满足选择:
std::hash<T>使用类模板替换整个相关模板参数.请注意,部分重载没有帮助,因为哈希函数需要以某种方式指定为无法通过重载函数完成的对象(除非它们是通过对象访问的,但这是区别对待的).模板函数不能部分专用于类型,而std::hash作为类模板专用于不同类型。
并且,在这种基于模板类的方式中,您可以进行一些元编程,例如访问返回类型和键类型,如下所示:
std::hash<X>::argument_type
std::hash<X>::result_type
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9156 次 |
| 最近记录: |