La libreria standard implementa std :: hash come una struttura di template specializzata per diversi tipi. È usato così:Perché std :: hash è una struct al posto di una funzione?
#include <iostream>
#include <functional>
int main()
{
std::hash<int> hasher;
std::cout << hasher(1337) << std::endl;
return 0;
}
La mia domanda è qual è il ragionamento dietro questa scelta di design. Perché non è implementata come una funzione template e utilizzato in questo modo:
#include <iostream>
#include <functional>
int main()
{
std::cout << std::hash<int>(1337) << std::endl;
return 0;
}
i 2 esempi sono identici, l'unica differenza è che nel secondo l'oggetto è senza nome. – user2485710
I contenitori associati non ordinati hanno un parametro del tipo di modello per specificare l'hash; questo permette di usare oggetti hash con stato (ad esempio usando un valore speciale che è XORed sull'hash). Ottenere il tipo di specializzazione di un modello di funzione non ha una bella sintassi. – dyp
@ user2485710 Il primo esempio viene compilato, il secondo no. Il secondo dovrebbe essere scritto come 'std :: hash() (1337)' per usare una struttura temporanea senza nome. –
hvd