I template in C++ e la programmazione generica in C
In questa lezione scriverai una funzione valida per più tipi di dati con i template del C++ e la confronterai con _Generic del C11.
Introduzione
I template permettono di scrivere un modello di codice generico, da cui il compilatore genera la versione adatta a ogni tipo di dato mantenendo la sicurezza dei tipi. In C, per ottenere qualcosa di simile, i programmatori usano di solito macro, puntatori void o la parola chiave _Generic del C11.
Punti importanti
- Capisci come si fa in C prima di imparare le astrazioni del C++.
- Usa RAII e la semantica di valore (value semantics) per esprimere il possesso delle risorse.
- Preferisci gli strumenti del C++ con sicurezza dei tipi a macro e conversioni di tipo.
Esempi di codice C e C++
#include <stdio.h>
int max_int(int left, int right) {
return left > right ? left : right;
}
double max_double(double left, double right) {
return left > right ? left : right;
}
#define MAX(left, right) _Generic((left), \
int: max_int, double: max_double)((left), (right))
int main(void) {
printf("%d %.1f\n", MAX(3, 9), MAX(2.5, 7.0));
}
9 7.0
#include <iostream>
template<class T>
T maximum(const T& left, const T& right) {
return left > right ? left : right;
}
int main() {
std::cout << maximum(3, 9) << ' '
<< maximum(2.5, 7.0) << '\n';
}
9 7
Confronto tra C e C++
In C, la macro MAX usa _Generic per scegliere max_int o max_double in base al tipo dell'argomento, ma bisogna elencare in anticipo ogni tipo supportato. In C++, il template maximum funziona con qualsiasi tipo che supporti il confronto >, senza riscrivere la funzione per ogni tipo.
C usa convenzioni sui nomi, callback, macro e struct con il contesto.
C++ offre astrazioni con un ambito chiaro, sicure rispetto ai tipi e che di solito non costano nulla in più in esecuzione.
Esercizi di approfondimento
Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.
- Scrivi prima il meccanismo in C e solo dopo usa la funzionalità equivalente del C++.
- Sostituisci la liberazione manuale delle risorse con RAII.
- Controlla se la funzionalità causa allocazioni di memoria o chiamate a funzioni virtuali.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
- Massimo dell'Array Trova il valore più grande in una lista. Facile
- Stack con minimo Costruisci uno stack che restituisce istantaneamente il suo elemento minimo dopo ogni push o pop. Media