Funzioni modello (Template functions).
Un modello (template) è un altro potente strumento del linguaggio C++ che ti consente di creare algoritmi senza essere legato ai tipi di dati. Utilizzando i modelli, puoi creare una funzione che funzionerà per tutti i tipi di dati! Il compilatore sceglierà quali tipi di dati sostituire nella funzione in fase di compilazione. La sintassi è simile a questa:
modello <parametri_modello> descrizione_funzione
La descrizione della funzione può essere ampliata:
modello <parametri_modello> tipo_dati (argomenti)
{
corpo della funzione
}
Esempio: una funzione che restituisce il quadrato di un numero di qualsiasi tipo.
template<typename T>
T squareVal(T val)
{
return val * val;
}
void setup()
{
byte a = 5;
int b = 32;
float c = 3.14;
a = squareVal(a);
b = squareVal(b);
c = squareVal(c);
}
Puoi passare più dati al modello! Un esempio di una funzione che moltiplica due numeri di qualsiasi tipo e restituisce il risultato:
template<typename T1, typename T2>
uint32_t mult(T1 val1, T2 val2)
{
return val1 * val2;
}
void setup()
{
byte a = 5;
int b = 32;
float c = 3.14;
long val = mult(a, b);
val = mult(a, c);
}
I modelli possono essere molto utili in alcune situazioni. Inoltre, quando si chiama una funzione modello, è possibile passare manualmente il tipo di dati: mult<byte, float>(a, c);
La modifica del tipo di dati restituito funzionerà esattamente allo stesso modo (vedi il primo esempio, la funzione restituisce un tipo di modello). Un esempio di una funzione che somma un array. Il vantaggio della versione template è che non è necessario passare la dimensione dell'array e nemmeno il tipo della variabile, può essere calcolata all'interno della funzione calcolando la dimensione tramite il template: array length (number) = sizeof( T) / sizeof(someArray[0]), quindi è la dimensione dell'intero array in byte divisa per la dimensione di qualsiasi elemento.
int c;
int myArray[] = {1, 2, 3, 4, 5, 6, 7, 8};
void setup()
{
Serial.begin(9600);
c = sumFunction(myArray);
Serial.println(c);
}
template <typename T>
int sumFunction(T &someArray)
{
int sum = 0;
for (int i = 0; i < sizeof(T) / sizeof(someArray[0]); i++)
{
sum += someArray[i];
}
return sum;
}
void loop()
{
}