ProgrammazioneSviluppatore C++

Che cosa sono i template in C++? Quali tipi di template esistono? Quali difficoltà e errori possono sorgere nella progettazione e nell'uso dei template? Mostra un esempio di template di classe e di funzione.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Template — un meccanismo di C++ che consente di creare classi e funzioni generiche che funzionano con diversi tipi di dati senza duplicazione del codice. Questo è alla base dell'implementazione dei contenitori STL, degli algoritmi e di molti pattern di programmazione generica.

Tipi di template:

  • Template di funzione: consentono di creare una funzione per diversi tipi.
  • Template di classe: consentono di creare classi che lavorano con diversi tipi.
  • Template con parametri di valore: si possono parametrizzare non solo i tipi, ma anche i valori costanti.

Esempio di template di classe:

template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };

Esempio di template di funzione:

template<class T> T add(const T& a, const T& b) { return a + b; }

Domanda insidiosa.

È possibile specializzare esplicitamente solo un metodo di una classe template, senza specializzare l'intera classe? Se sì, come si fa?

Risposta:
Sì, è possibile. Non è necessario specializzare l'intera classe; puoi semplicemente specializzare un metodo separato:

template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // Specializzazione solo del metodo bar per int // Implementazione }

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze dell'argomento.


Storia
Un progetto ha scritto un template di funzione per la comparazione:

template <typename T> bool cmp(const T& a, const T& b) { return a < b; }

Quando utilizzato con tipi che non avevano l'operatore <, si è verificato un errore di compilazione, che è stato difficile da individuare, poiché la diagnostica veniva fornita solo al momento dell'istanza del template, e non nel momento della sua definizione.


Storia
Un sviluppatore ha cercato di utilizzare l'addizione in un template di funzione per una classe personalizzata, dimenticando di sovraccaricare l'operatore +. Ciò ha portato a errori di compilazione alla prima chiamata con questa classe.


Storia
Durante lo sviluppo di un contenitore basato su un template di classe, è stato creato un metodo che non dipendeva dal tipo di template, ma è stato estratto al di fuori della classe senza specializzazione esplicita:

template<> int MyContainer<int>::size() const { ... }

Ciò ha portato a un errore di collegamento, perché la specializzazione è stata dichiarata, ma non è stata realizzata correttamente per tutti i tipi.