2016-04-29 30 views
10

Secondo la pagina di Wikipedia per Parametric Polymorphism:Perché il C++ non supporta il polimorfismo parametrico?

Alcune implementazioni di tipo polimorfismo sono superficialmente simile a polimorfismo parametrico, mentre anche l'introduzione di aspetti ad hoc. Un esempio è la specializzazione dei modelli C++.

Domanda: Perché C++ ha detto di implementare qualcosa solo superficialmente simile a parametrizzato polimorfismo? In particolare, i template non sono un esempio completo di polimorfismo parametrico?

+0

Indipendentemente dalla risposta a questa domanda, quella pagina di wikipedia ha bisogno di molto amore ... – Barry

+1

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

risposta

1

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.

1

L'articolo che hai collegato per spiegarlo. Lo stesso testo che hai citato fornisce un esempio di qualcosa che imposta i modelli di C++ oltre al puro polimorfismo parametrico: la specializzazione dei modelli C++.

Si continua su questo tema:

seguito Christopher Strachey, [2] polimorfismo parametrico può essere contrastato con ad hoc polymorphism, in cui una singola funzione polimorfica può avere un numero di implementazioni distinte e potenzialmente eterogenei seconda sul tipo di argomento a cui è applicato. Pertanto, il polimorfismo ad hoc può generalmente supportare solo un numero limitato di tali tipi distinti, poiché è necessario fornire un'implementazione separata per ciascun tipo.

Così, come descritto, modelli C++ si avvicinano ai — ma non sono esattamente — polimorfismo parametrico.