# Informatica 2 Liceo Scientifico Scienze Applicate/Template

Informatica 2 Liceo Scientifico Scienze Applicate
Copertina Tutti i moduli · Sviluppo
* Linguaggi di programmazioneInformatica 2 Liceo Scientifico Scienze Applicate/Linguaggi di programmazione
* Compilare un programmaInformatica 2 Liceo Scientifico Scienze Applicate/Compilare un programma
* CiaoMondoInformatica 2 Liceo Scientifico Scienze Applicate/CiaoMondo
* AreaRettangoloInformatica 2 Liceo Scientifico Scienze Applicate/AreaRettangolo
* AreaTrapezioInformatica 2 Liceo Scientifico Scienze Applicate/AreaTrapezio
** Compito1Informatica 2 Liceo Scientifico Scienze Applicate/Compito1
* Programmazione ImperativaInformatica 2 Liceo Scientifico Scienze Applicate/Programmazione Imperativa
* Diagrammi di FlussoInformatica 2 Liceo Scientifico Scienze Applicate/Diagrammi di Flusso
* Operatori AritmeticiInformatica 2 Liceo Scientifico Scienze Applicate/Operatori Aritmetici
* Istruzione ifInformatica 2 Liceo Scientifico Scienze Applicate/Istruzione if
** Esercizio Equazione 2^ gradoInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio Equazione 2^ grado
** Esercizio Calcola lo ScontoInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio Calcola lo Sconto
** Esercizio Calcola lo Sconto2Informatica 2 Liceo Scientifico Scienze Applicate/Esercizio Calcola lo Sconto2
* Operatori LogiciInformatica 2 Liceo Scientifico Scienze Applicate/Operatori Logici
** Esercizio x interno all'intervalloInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio x interno all'intervallo
** Esercizio x esterno all'intervalloInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio x esterno all'intervallo
* Istruzione switchInformatica 2 Liceo Scientifico Scienze Applicate/Istruzione switch
** Esercizio Scelta EquazioneInformatica 2 Liceo Scientifico Scienze Applicate/Esercizio Scelta Equazione
* Altre Istruzioni di Scelta o DiramazioneInformatica 2 Liceo Scientifico Scienze Applicate/Altre Istruzioni di Scelta o Diramazione
* Istruzioni di RipetizioneInformatica 2 Liceo Scientifico Scienze Applicate/Istruzioni di Ripetizione
** Es (do-while) Indovina il numeroInformatica 2 Liceo Scientifico Scienze Applicate/Es (do-while) Indovina il numero
** Es (while) La nonna è stancaInformatica 2 Liceo Scientifico Scienze Applicate/Es (while) La nonna è stanca
** Es (for) Somma di 5 numeriInformatica 2 Liceo Scientifico Scienze Applicate/Es (for) Somma di 5 numeri
** Es (for) Analisi sequenza datiInformatica 2 Liceo Scientifico Scienze Applicate/Es (for) Analisi sequenza dati
** Es (for) Sequenze NumericheInformatica 2 Liceo Scientifico Scienze Applicate/Es (for) Sequenze Numeriche
** Es (for) SupermarketInformatica 2 Liceo Scientifico Scienze Applicate/Es (for) Supermarket
** Es (while) Bisca ClandestinaInformatica 2 Liceo Scientifico Scienze Applicate/Es (while) Bisca Clandestina
* Compito2Informatica 2 Liceo Scientifico Scienze Applicate/Compito2
* I vettoriInformatica 2 Liceo Scientifico Scienze Applicate/I vettori
** Es Usiamo i vettoriInformatica 2 Liceo Scientifico Scienze Applicate/Es Usiamo i vettori
** Es2 Usiamo i vettoriInformatica 2 Liceo Scientifico Scienze Applicate/Es2 Usiamo i vettori
** Es3 Supermarket con vettoriInformatica 2 Liceo Scientifico Scienze Applicate/Es3 Supermarket con vettori
** Compito dic 2019Informatica 2 Liceo Scientifico Scienze Applicate/Compito dic 2019
** BubbleSortInformatica 2 Liceo Scientifico Scienze Applicate/BubbleSort
** Ricerca DicotomicaInformatica 2 Liceo Scientifico Scienze Applicate/Ricerca Dicotomica
* Matrici e ArrayInformatica 2 Liceo Scientifico Scienze Applicate/Matrici e Array
** Es matrici battaglia navaleInformatica 2 Liceo Scientifico Scienze Applicate/Es matrici battaglia navale
** Es matrici 1Informatica 2 Liceo Scientifico Scienze Applicate/Es matrici 1
** Es matrici 2Informatica 2 Liceo Scientifico Scienze Applicate/Es matrici 2
* PuntatoriInformatica 2 Liceo Scientifico Scienze Applicate/Puntatori
* StructInformatica 2 Liceo Scientifico Scienze Applicate/Struct
** Es Bubble Sort con StructInformatica 2 Liceo Scientifico Scienze Applicate/Es Bubble Sort con Struct
* FunzioniInformatica 2 Liceo Scientifico Scienze Applicate/Funzioni
* Funzioni Void e non VoidInformatica 2 Liceo Scientifico Scienze Applicate/Funzioni Void e non Void
** esercizi1 funzioniInformatica 2 Liceo Scientifico Scienze Applicate/esercizi1 funzioni
** esercizi2 funzioniInformatica 2 Liceo Scientifico Scienze Applicate/esercizi2 funzioni
** esercizi3 funzioniInformatica 2 Liceo Scientifico Scienze Applicate/esercizi3 funzioni
* BacktrackingInformatica 2 Liceo Scientifico Scienze Applicate/Backtracking
* TemplateInformatica 2 Liceo Scientifico Scienze Applicate/Template
* FileInformatica 2 Liceo Scientifico Scienze Applicate/File
** File di TestoInformatica 2 Liceo Scientifico Scienze Applicate/File di Testo
** File BinariInformatica 2 Liceo Scientifico Scienze Applicate/File Binari
** File RecordsInformatica 2 Liceo Scientifico Scienze Applicate/File Records
** Es FilesInformatica 2 Liceo Scientifico Scienze Applicate/Es Files
* Esercizi VacanzeInformatica 2 Liceo Scientifico Scienze Applicate/Esercizi Vacanze
** Esercizi1Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi1
** Esercizi2Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi2
** Esercizi3Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi3
* Olimpiadi Informatica
** NobileChimicoInformatica 2 Liceo Scientifico Scienze Applicate/NobileChimico
** Sunnydale
** MappaAnticaInformatica 2 Liceo Scientifico Scienze Applicate/MappaAntica
Modifica il sommario

## I Template

I Template sono utilizzati in C++ nella metaprogrammazione, ovvero nella scrittura di codice generico e modificabile dal programma stesso. L'aspetto più importante è appunto la scrittura di codice generico. Normalmente quando si scrive una funzione, a meno di overload, essa ha un unico elenco di parametri e sicuramente un unico tipo di ritorno. I Template permettono di creare un'unica funzione che poi il compilatore genera per ogni tipo per cui viene utilizzata. Ad esempio, creare una funzione di somma richiede un overload per ogni tipo (int, long, long long, float, ...). Con i Template invece è possibile ridurre il tutto in poche linee di codice:
La funzione è poi chiamabile da altre (come il main)
La chiamata non risulta quindi molto diversa rispetto alle chiamate a normali funzioni. Ora è quindi possibile sommare qualsiasi tipo. Non sono però assenti limitazioni. Innanzitutto non è possibile chiamarla per due tipi diversi, quali double ed int ad esempio, e come seconda cosa il tipo di ritorno è sempre un double, anche se la somma è tra due unsigned long long, il che è un problema. La soluzione a ciò è:
Si possono notare ora due tipi "ignoti": T ed U. Il tipo di ritorno è strano! decltype(std::declval<T> + std::declval‹U›) ritorna il tipo della somma di due oggetti di T e di U. È come scrivere TipoDellaSommaDiTeU. decltype ritorna il tipo a tempo di compilazione dell'espressione contenuta mentre std::declval<>, anch'esso un Template, ritorna un oggetto del tipo contenuto come parametro Template (è utile quando bisogna creare un oggetto di un tipo se non si conosce il suo costruttore). E così possibile ottenere il tipo corretto da una operazione di somma. La chiamata è sempre simile, ma questa volta gli argomenti del Template sono due:
Come nelle normali funzioni, è possibile indicare argomenti facoltativi che vanno posti per ultimi. La sintassi è molto simile:
Infine bisogna precisare che gli argomenti Template non sono solo tipi, è possibile infatti passare anche oggetti, che devono essere noti a tempo di compilazione (quindi solo oggetti globali) o rvalue o interi o enumerazioni. Inoltre i Template si estendono alle strutture e alle classi
Inoltre typename e class sono sinonimi se usati per argomenti template, quindi la precedente funzione Sum equivale a questa:
typename è utilizzato se i Template vengono introdotti prima delle classi e si vuole nascondere l’esistenza della keyword class.

## Template Argument Deduction

Quando è possibile dedurre il tipo è possibile evitare le chiamate descritte sopra e semplificarle:
Che equivale a:
Il compilatore è in grado di dedurre i tipi automaticamente, senza specificarli. Alcuni Template richiedono però un tipo obbligatoriamente, come std::function<> ma anche std::declval<>. Questo accade quando ad esempio il tipo (o tipi) ignoto è il tipo di ritorno e non vi sono parametri che lo facciano dedurre.

## Specializzazione di un Template

Immaginiamo di avere una classe Array tipo questa
Quindi possiamo dichiarare un Array per ogni tipo, ma le funzioni disponibili saranno sempre le stesse. Ora immaginiamo di voler un operator! per un Array<bool> che semplicemente crea il complementare dell'Array. Beh, non potremmo normalmente perché dovremo implementare l'operator! per tutti gli Array e non è quello che vogliamo. Possiamo però specializzare la classe per <bool> in questo modo:
Teniamo presente però che nella specializzazione dobbiamo riscrivere l'intera classe. Non vi è alcuna derivazione dalle altre.
La specializzazione entra in gioco quando si parla di metaprogrammazione. Prima di C++11, dove non era presente il specifier constexpr, per realizzare certe funzioni che dovevano essere valutate a tempo di compilazione si doveva utilizzare i Template. Ad esempio proviamo a calcolare il fattoriale di un numero con i Template:
E si utilizza così
Beh, ora che possiamo avere calcoli così deep a costo zero in esecuzione verrebbe da usarli in questo modo
vero? Beh, no. I Template vengono appunto calcolati in compilazione, e non si conosce il valore di n in compilazione, ma in esecuzione. E no, non basta calcolare già la struttura di un numero molto grande per avere già risultati pronti.
La variante constexpr è invece molto flessibile ed è utilizzabile pure in contesti non costanti.

## Problemi con i Template

I Template hanno dei problemi. Il primo è che niente vieta di chiamare una funzione che utilizza certi operatori o certe funzioni membro. Ad esempio chiamate del tipo
mettono in crisi il nostro compilatore, non tanto per gli indirizzi nullptr, ma perché tenta di chiamare (int*).operator+(int*), che non esiste. Non abbiamo quindi sicurezza per quanto riguarda i tipi. Il secondo è che il compilatore è costretto a creare una funzione per ogni tipo che chiamiamo, il che produce codice molto ridondante.

## Variadic Template

Immaginiamo ora di volere una funzione Sum che sommi un indefinito numero di parametri, ma almeno due. Normalmente è impossibile farlo se non con <cstdarg> I Template semplificano un sacco la cosa:
args è un pacchetto, come T. Il primo è un pacchetto di argomenti, mentre T di tipi. L’operatore sizeof... permette di sapere quanti argomenti contenga. La scrittura (args + ...) permette di espandere il pacchetto in (((arg1 + arg2) + arg3) + ...). Anche qui possiamo ricavare errori, prima dall'uso dell'operatore + e poi dal cast a long double. Per quanto riguarda il secondo, ci basta utilizzare il nuovo auto del C++11:
Qui il tipo di ritorno è dedotto alla fine. Ora è addirittura possibile sommare stringhe!
Va detto che tale metodo rappresentato è solo valido nel C++17. Un buon compilatore vi darà questo errore o simili se state utilizzando C++14 o precedenti: "warning: fold-expressions only available with -std=c++17 or -std=gnu++17". Precedentemente l'espansione era più complessa e per mostrarla si utilizzerà una funzione Print(...) che stamperà a schermo i parametri (una sorta di printf(char*, ...) ma senza la stringa). Questo è il codice che attualmente utilizzeremo:
Pre C++17 invece si utilizzava questo codice
O volendo semplificare, post C++11:
Comunque più complessa e ricorsiva.