C++ moderno e alternative C

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++

C
Esegui →
main.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));
}
Risultato dell'esecuzione
9 7.0
C++
Esegui →
main.cpp
#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';
}
Risultato dell'esecuzione
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

C usa convenzioni sui nomi, callback, macro e struct con il contesto.

C++

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.

Tutte le sfide