Perché il C++ ha detto di implementare solo qualcosa di superficialmente simile al polimorfismo parametrizzato? In particolare, i template non sono un esempio completo di polimorfismo parametrico?
Le funzioni basate su modelli in C++ funzionano sulla base della "sostituzione" del parametro. Il che significa essenzialmente che il compilatore genera ancora un'altra versione della funzione in cui gli argomenti del modello sono codificati nella funzione.
Supponiamo di avere questo in C++:
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
int i = add(2, 3);
double d = add(2.7, 3.8);
return i + (int)d;
}
Durante la compilazione, che si tradurrà in due funzioni: int add(int a, int b) { return a + b; }
e double add(double a, double b) { return a + b; }
Una funzione sarà solo di gestire interi, e l'altro sarà gestire solo doppie. Nessun polimorfismo.
Quindi, in realtà, si ottengono tante implementazioni quante il numero di varianti di argomenti.
"Ma perché non è questo polimorfismo parametrico?" si potrebbe chiedere?
È necessario il codice sorgente completo della funzione "aggiungi", per chiamarlo con la propria variante particolare di qualcosa che sovraccarica l'operatore "+" binario! - Quello è il dettaglio che fa la differenza.
Se C++ avesse il proprio polimorfismo parametrico, come C# per esempio, l'implementazione finale compilata di "add" conterrebbe abbastanza logica per determinare in fase di esecuzione quale sarebbe il sovraccarico "+" per ogni dato parametro accettabile per "aggiungere". E non avresti bisogno del codice sorgente per quella funzione, per chiamarlo con i nuovi tipi che hai inventato.
Cosa significa in realtà?
Ma non lo capisco come se C++ fosse meno potente o C# fosse più potente. È semplicemente uno dei tanti dettagli delle funzionalità linguistiche.
Se la fonte completa è disponibile per le funzioni basate su modelli, la semantica di C++ è di gran lunga superiore. Se hai solo una libreria statica o dinamica a tua disposizione, allora una implementazione parametrica polimorfica (ad es. C#) è superiore.
Indipendentemente dalla risposta a questa domanda, quella pagina di wikipedia ha bisogno di molto amore ... – Barry
Quella pagina wiki viene da un punto di vista teorico - rigorosa specificazione matematica della teoria dei tipi, e quindi, il termine "polimorfismo parametrico" "ha una definizione rigorosa. I modelli C++ sono più ... flessibili ... di quanto una teoria del genere potrebbe/potrebbe fornire. E quindi ... forse più utile! Sicuramente molto più _interessante_! Ad ogni modo, ho sempre sentito i modelli C++ descritti come "polimorfismi ad hoc". – davidbak