hashing funcion codigo code c++ c++11 std c++-standard-library stdhash

c++ - funcion - ¿Por qué es std:: hash una estructura en lugar de una función?



codigo de funcion hash en c (2)

Hay, múltiples razones, cada una lo suficientemente buena como para la elección:

  1. Puede especializar parcialmente las plantillas de clase, pero solo puede usar plantillas de funciones totalmente especializadas (al menos hasta el momento). Por lo tanto, puede proporcionar un reemplazo para un conjunto completo de argumentos de plantilla relacionados con std::hash<T> como plantilla de clase. Tenga en cuenta que la sobrecarga parcial no ayuda porque la función hash tendría que especificarse de alguna manera como un objeto que no puede hacerse con funciones sobrecargadas (a menos que se acceda a través de un objeto pero eso es lo que se diferencia).
  2. Los contenedores asociativos no ordenados están parametrizados con una entidad estática (que también puede personalizarse dinámicamente si el tipo específico lo admite), lo que se hace más fácilmente utilizando plantillas de clase.
  3. Dado que las entidades utilizadas para la función hash son personalizables, la opción es entre usar un tipo o un puntero de función para la personalización. Los punteros de función a menudo son difíciles de en línea, mientras que las funciones de miembro de un tipo son triviales a en línea, lo que mejora el rendimiento de funciones simples, como calcular un hash simple bastante.

La biblioteca estándar implementa std :: hash como una estructura de plantilla especializada para diferentes tipos. Se usa así:

#include <iostream> #include <functional> int main() { std::hash<int> hasher; std::cout << hasher(1337) << std::endl; return 0; }

Mi pregunta es cuál es el razonamiento detrás de esta elección de diseño. Por qué no se implementa como una función de plantilla y se usa de esta manera:

#include <iostream> #include <functional> int main() { std::cout << std::hash<int>(1337) << std::endl; return 0; }


Una función de plantilla no puede ser parcialmente especializada para tipos, mientras que std::hash especializa para diferentes tipos como plantilla de clase.

Y, en esta forma de plantilla de plantilla, puede hacer alguna programación de metadatos como el acceso al tipo de retorno y el tipo de clave, como a continuación:

std::hash<X>::argument_type std::hash<X>::result_type