=>
Programmazione generica e STL
RIASSUNTO CAPITOLO 6 PROGRAMMAZIONE LIBRO
La programmazione generica è uno degli s3li di programmazione supporta3 dal C++
che consiste nella scri8ura di algoritmi e stru8ure da3 in termini di 3pi che vengono
specifica3 come se fossero una specie di parametri.
Questo è par3colarmente u3le in quanto mol3 algoritmi e stru8ure da3 sono
indipenden3 dai 3pi di da3 su cui si operano e nel caso del C++ è par3colarmente
interessante perché è un linguaggio che usa un controllo dei 3pi sta3co, cioè
controlla i 3pi delle variabili al momento della compilazione anziché a run-3me.
La programmazione generica bene o male consente di evitare parzialmente questo
controllo visto che il 3po viene passato come parametro del codice.
- 6.2: template
I template sono il costru8o del C++ alla base della programmazione generica e
consentono di generare versioni mul3ple del codice a8raverso la parametrizzazione
dei 3pi di da3, consentendo di scrivere codice generico indipendentemente dal 3po
mantenendo la 3pizzazione del linguaggio dato.
In C++ abbiamo due 3pi di template:
1. Funzioni template: funzioni speciali in grado di operare su 3pi generici.
2. Classi template: classi che hanno membri, sia a8ribu3 che metodi, che usano i
parametri del template come 3pi.
3. Variabili template (a par3re dal C++14).
Esa8amente come le classi generiche, anche quelle template supportano il
meccanismo di ereditarietà. A livello sintaQco si scrive template <template-
argument-list>.
Gli argomen3 della lista indicano i parametri di 3po usa3 nel codice e sono della
forma typename T, dove T è il marcatore usato nel codice sos3tuito dal 3po passato
come parametro del template.
Al posto della scri8ura typename si può usare anche la scri8ura class, ma è meno
consigliata in quanto rende meno chiaro l’intento di passaggio del nome di un 3po.
- 6.2.1: funzione template
Sono funzioni che usano, oltre i parametri normalmente usa3 nelle funzioni, i
parametri template per i 3pi e hanno lo scopo di passare dei 3pi come parametri.
In alcuni casi il codice generico deve avere degli ada8amen3 speciali per qualche
3po così che la specializzazione non venga applicata per essi ma si usa una versione
par3colare.
La sintassi usa una lista vuota dei parametri di 3po e la specializzazione del 3po dopo
il nome della funzione, così come si specializza il 3po quando si invoca.
- 6.2.2: classi template
Sono classi che possono avere membri che usano i parametri del template come 3pi.
Tu8avia, a differenza delle funzioni template, l’istanziazione di una classe template
deve essere sempre esplicita.
Questo vuol dire che il compilatore genererà una classe diversa per ogni 3po per cui
è richiesta la specializzazione, sos3tuendo ad ogni parametro del template il 3po
specificato.
È importante, inoltre, che il compilatore sappia applicare una poli3ca di istanziazione
su richiesta per i metodi, ossia il codice viene generato solo per i metodi
effeQvamente invoca3. Se il metodo di una classe non viene mai invocato per una
specializzazione il suo codice non sarà mai compilato.
Esa8amente come le funzioni, anche le classi template possono essere specializzate
per fornire varian3 specifiche per un qualche 3po per il quale la generazione del
codice da un template non sarebbe appropriata. A livello sintaQco, la sintassi è la
stessa delle funzioni.
- 6.2.3: parametri template
Esa8amente come i parametri usa3 nelle funzioni, i parametri template possono
avere dei parametri di default in modo tale da semplificare l’uso dei template.
L’uso di parametri template con argomen3 di default è molto comune nella libreria
standard del C++ e se un template ha tuQ valori di default può essere istanziato
senza fornire alcun parametro.
1. Parola chiave template: questa parola chiave può essere usata in mol3 altri
contes3 oltre che nella dichiarazione di funzioni e classi template come, ad
esempio, la specifica dei nomi dei 3pi, che in C++ possono essere di 3po
qualificato o non qualificato.
Nel caso dei template i nomi possono essere dipenden3 o non dipenden3
secondo se hanno una dipendenza rispe8o al parametro del template.
La parola chiave typename indica al compilatore che il nome seguente deve
essere interpretato come un 3po; dunque, quando scriviamo template
<typename T> vogliamo indicare al compilatore che nel codice template T
indica un 3po.
Se il 3po è un nome qualificato che coinvolge l’uso di un parametro template
si deve usare typename; in caso contrario, se non si usa typename, i nomi
qualifica3 e dipenden3 non devono essere interpreta3 come 3pi, nonostante
questo por3 a un errore di sintassi.
- 6.2.5: requisi3 implici3
Per quanto riguarda i requisi3 implici3 del codice template, ques3 diventano
eviden3 solo al momento della compilazione per una determinata specializzazione.
InfaQ, il codice template potrebbe lavorare solo per alcuni 3pi e non per altri.
Nel caso delle classi, alcuni metodi sono compilabili per mol3 o tuQ i 3pi mentre
altri possono essere compila3 solo per alcuni.
- 6.2.6: organizzazione del codice
A differenza della “normale programmazione” in C++, dove funzioni e classi vengono
dichiarate nel file header e vengono successivamente implementate nel file
sorgente, il codice template dev’essere presente solo nel file header.
Questo perché il compilatore ha bisogno di avere sia la dichiarazione che la
definizione per poter produrre la specializzazione.
- 6.2.7: external template
L’istanziazione di un template è generata quando il templat
-
Appunti riassuntivi Programmazione (parte 3, design OO e eccezioni)
-
Appunti riassuntivi Programmazione (parte 6, adapter e observer)
-
Appunti riassuntivi Programmazione (parte 1, linguaggio C++)
-
Appunti riassuntivi Programmazione (parte 5, puntatori e design pattern)