No. Non ha nulla a che fare con il sovraccarico. Gli "aspetti ad-hoc" non sono ad-hoc aggiunte , sono differenze che rendono i modelli qualcosa di molto diverso dal polimorfismo parametrico. In altre parole, come indicava l'articolo di Wikipedia, i modelli in C ++ sono qualcosa di completamente diverso dal polimorfismo parametrico.
Il polimorfismo parametrico indica che il tipo di una funzione è parametrizzato da un altro tipo e quindi la funzione funzionerà per tutti i tipi potenzialmente forniti. Affinché funzioni, la funzione non può assumere nulla sul tipo, tranne ciò che è vero per tutti i tipi. L'esempio più semplice è il tipo di funzione di identità:
template <typename T> T identity(T t);
Se questo fosse in realtà un tipo parametrico polimorfo, sapremmo che oltre a fare alcuni effetti collaterali, l'unica cosa che identity
potrebbe fare è restituire il suo argomento, cioè l'unica implementazione (di ritorno) sarebbe:
template <typename T> T identity(T t) { doStuff(); return t; }
Ma questo non è affatto applicato da C ++. In particolare, quanto segue è un'implementazione completamente valida per quanto riguarda il C ++:
template <typename T> T identity(T t) { return 0; }
Ovviamente ciò funzionerà solo con tipi T
per i quali l'espressione 0
ha senso. È possibile utilizzare questa funzione modello per tutto il codice senza problemi. Scoprirai che c'è un problema solo se crei un'istanza di T
in un tipo per il quale 0
non ha senso. Se i modelli C ++ fossero polimorfismi parametrici, l'ultima implementazione di identity
verrebbe rifiutata come mal digitata, indipendentemente dal fatto o dal modo in cui è stata utilizzata.
I modelli C ++ sono ciò che dicono sulla latta; sono modelli di codice che possono essere, essenzialmente sintatticamente, istanziati, il risultato quindi controllato da un tipo. Non sono tipi loro stessi.