C ++ succintamente modelli

introduzione

Le funzioni e le classi dei modelli hanno uno scopo simile in C ++ in quanto i generici servono in C #. Ti consentono di riutilizzare il codice senza scrivere una funzione o una classe per ogni variante desiderata. Finché i tipi che fornisci al modello hanno la funzionalità ad essi associata utilizzata dal modello, tutto va bene. In caso contrario, il compilatore genererà un errore. Questo perché il compilatore sta generando una classe unica per ogni specializzazione che usi. Poiché il compilatore crea classi e funzioni dai modelli del tuo programma, le funzioni e le classi del modello devono essere inserite nei file di intestazione e definite interamente in linea. In questo modo, il compilatore può analizzarli per tutti i file di codice sorgente che li utilizzano.

In definitiva, i modelli possono diventare molto complessi. La libreria standard C ++ dimostra la potenza e la complessità dei modelli avanzati. Nonostante ciò, non è necessaria una conoscenza avanzata dei modelli per utilizzarli in modo efficace. Una comprensione dei fondamenti dei modelli C ++ ti aiuterà a sbloccare una quantità significativa di funzionalità e potenza.


Funzioni del modello

Una funzione template è una funzione autonoma che accetta almeno un argomento template. Il fatto che richieda un argomento lo rende incompleto finché non viene chiamato con un argomento concreto, facendo in modo che il modello diventi una funzione completamente definita. Ecco una funzione template che accetta due argomenti.

Esempio: TemplatesSample \ PeekLastItem.h

#pragma una volta modello U PeekLastItem (T & collection) return * collection.rbegin (); 

La creazione di qualsiasi funzione di modello o di classe inizia con il modello di parola chiave seguito dai parametri tra parentesi, come mostrato nel campione precedente con classe T e classe U. L'uso della classe parola prima di T e U non significa quelli gli argomenti devono essere classi. Pensa invece alla classe come a una parola generale intesa a trasmettere il significato di un tipo non specifico. Si potrebbe avere un modello con tipi concreti o con una combinazione di tipi di classi e tipi di calcestruzzo non specifici, come ad esempio modello. L'uso di T come nome per il primo argomento e U per un secondo è una pratica comune, non un requisito. Potresti usare quasi tutto come nome di un argomento template.

La funzione precedente contiene un riferimento a un elemento di tipo T. Presuppone che T abbia una funzione membro chiamata rbegin, che può essere chiamato senza argomenti e restituirà un tipo di puntatore che, quando de-referenziato, diventerà un oggetto di tipo U. Questa particolare funzione è progettata principalmente per funzionare con molte classi di raccolta della libreria standard C ++, sebbene qualsiasi classe che soddisfa le ipotesi che la funzione rende su tipo T può essere usata con questa funzione template. Quella capacità di prendere qualsiasi tipo, aggiungere le funzionalità necessarie ad esso, e quindi renderla idonea per l'uso con un modello è l'estrazione principale di modelli.


Classi di modelli

Le classi template sono simili alle funzioni template, solo che sono classi piuttosto che semplici funzioni stand-alone. Diamo un'occhiata a un esempio.

Esempio: TemplatesSample \ SimpleMath.h

#pragma una volta modello class SimpleMath public: SimpleMath (void)  ​​~ SimpleMath (void)  ​​T Add (T a, T b) return a + b;  T Subtract (T a, T b) return a - b;  T Moltiplica (T a, T b) restituisce a * b;  T Divide (T a, T b) return a / b; ;

Come suggerisce il nome, questa classe non vuole essere più di una dimostrazione. C'è solo un argomento di tipo. Osservando la definizione della classe, possiamo dedurre che i requisiti per T in questo caso sono che ha i seguenti operatori, che operano tutti su due istanze di T e restituiscono un'istanza di T:

  • +
  • -
  • *
  • /

Sebbene questi logicamente appartengano ai numeri, è possibile definire questi operatori per qualsiasi classe o tipo di dati e quindi istanziare un'istanza di questa classe template, che è specializzata per la propria classe personalizzata (ad es. Una classe Matrix).

Un'ultima nota, se dovessi definire le funzioni membro al di fuori della definizione della classe, ma comunque all'interno dello stesso file di intestazione, ovviamente, dovresti usare la parola chiave inline nelle dichiarazioni; le definizioni apparirebbero così: SimpleMath :: SimpleMath (void) .

Questo è l'ultimo file di questo esempio, che mostra un semplice utilizzo di ciascuno dei modelli precedenti.

Esempio: TemplatesSample \ TemplatesSample.cpp

#includere  #includere  #includere  #include "SimpleMath.h" #include "PeekLastItem.h" #include "... /pchar.h" utilizzando namespace std; int _pmain (int / * argc * /, _pchar * / * argv * / []) SimpleMath smf; wcout << "1.1F + 2.02F = " << smf.Add(1.1F, 2.02F) << "F." << endl; vector STR; strs.push_back (L "Ciao"); strs.push_back (L "World"); wcout << L"Last word was '" << PeekLastItem,const wchar_t *> (strs) << L"'." << endl; return 0; 

Conclusione

Le funzioni dei modelli ti aiutano a riutilizzare il codice, il che a sua volta semplifica la gestione del codice e l'ESSENZIALITÀ (non ripeti te stesso). Le espressioni lambda sono l'argomento del prossimo articolo di questa serie.

Questa lezione rappresenta un capitolo di C ++, un eBook gratuito del team di Syncfusion.