Ответ 1
Есть несколько причин, каждый из которых достаточно хорош для выбора:
- Вы можете частично специализировать шаблоны классов, но вы можете только полностью специализированные шаблоны функций (по крайней мере, до сих пор). Таким образом, вы можете предоставить замену для целого набора связанных аргументов шаблона, когда
std::hash<T>
является шаблоном класса. Обратите внимание, что частичная перегрузка не помогает, потому что хеш-функцию нужно будет каким-то образом указать как объект, который нельзя сделать с перегруженными функциями (если только они не доступны через объект, а то, что отличается от него). - Неупорядоченные ассоциативные контейнеры параметризуются статическим объектом (который также может быть настроен динамически, если конкретный тип поддерживает это), что упрощается с использованием шаблонов классов.
- Поскольку объекты, используемые для хеш-функции, настраиваются, выбор заключается в использовании указателя типа или функции для настройки. Указатели функций часто трудно встроить, в то время как встроенные функции-члены типа тривиальны для встроенных, что повышает производительность для простых функций, таких как простое вычисление простого хеша.