Standard library implements std::hash as a template struct that is specialized for different types. It is used like this:
#include <iostream>
#include <functional>
int main()
{
std::hash<int> hasher;
std::cout << hasher(1337) << std::endl;
return 0;
}
My question is what is the reasoning behind this design choice. Why it isn't implemented as a template function and used like this:
#include <iostream>
#include <functional>
int main()
{
std::cout << std::hash<int>(1337) << std::endl;
return 0;
}
There are, multiple reasons, each one good enough to just the choice:
std::hash<T>
being a class template. Note that, partial overloading doesn't help because the hash function would need to be specified somehow as an object which can't be done with overloaded functions (unless they are accessed via an object but that's what is differentiated against).