Стандартная библиотека реализует 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;
}
Есть несколько причин, каждая из которых достаточно хороша для выбора:
std::hash<T>
будучи шаблоном класса. Обратите внимание, что частичная перегрузка не помогает, потому что хэш-функцию нужно как-то указывать как объект, который нельзя сделать с помощью перегруженных функций (если к ним не обращаются через объект, но это то, что отличается от них).Функция шаблона не могу быть частично специализированным для типов, в то время как std::hash
специализированный для разных типов в качестве шаблона класса.
И таким способом, основанным на классах шаблонов, вы можете выполнять некоторые метапрограммирования, такие как доступ к типу возвращаемого значения и типу ключа, как показано ниже:
std::hash<X>::argument_type
std::hash<X>::result_type