Polymorphism parametrico C ++

2

Nell'articolo di Wikipedia su Parametric Polymorphism , è il seguente commento su C ++. Qualcuno può spiegare a cosa si riferisce quando si parla di "aspetti ad hoc"? (Penso che abbia bisogno di una citazione).

Some implementations of type polymorphism are superficially similar to parametric polymorphism while also introducing ad hoc aspects. One example is C++ template specialization.

Dalla lettura di I quattro polimorfismi in C ++ , si suppone che l'articolo di wikipedia stia parlando di polimorfismo specifico "aka sovraccarico. È corretto?

    
posta spirc 03.03.2016 - 03:45
fonte

2 risposte

3

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.

    
risposta data 03.03.2016 - 06:19
fonte
0

Penso che l'articolo di Wikipedia sia giusto. La specializzazione dei modelli consente un comportamento ad hoc.

Puoi pensare alle specializzazioni dei modelli di modelli di funzioni come sovraccarichi di funzioni. Tuttavia, il concetto di overload non esiste per le classi.

Quando si tratta di classi, la specializzazione dei modelli è esattamente questa: specializzazioni di un modello generico che consente l'implementazione di comportamenti ad hoc.

    
risposta data 03.03.2016 - 18:10
fonte

Leggi altre domande sui tag