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:
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; }
È 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 }
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.