- Incapsulamento ed estensibilità dei Tipi
- Ereditarietà
- Polimorfismo
- L' Overload
- Funzioni Virtuali
- I Membri Statici di una classe
- Templates di Funzioni
- Templates delle Classi
- Classi Astratte
Templates di Funzioni
Funzioni overloadate vengono comunemente utilizzati per eseguire operazioni simili su vari tipi di dati. ArraySize() è un semplice esempio di tale funzione in MQL5. Restituisce la grandezza di qualsiasi tipo di array. In realtà, questa funzione di sistema è overloadata e l'intera implementazione di un tale sovraccarico è nascosto agli sviluppatori di applicazioni MQL5:
int ArraySize(
|
Ciò significa che il compilatore del linguaggio MQL5 inserisce implementazioni necessarie per ogni chiamata di questa funzione. Ad esempio, è così che si può fare per gli array di tipo double:
int ArraySize(
|
La funzione Arraysize() può essere visualizzata nel modo seguente per il tipo di array MqlRates per l'utilizzo di quotazioni in formato dati storici:
int ArraySize(
|
Pertanto, è molto conveniente utilizzare la stessa funzione per lavorare con differenti tipi. Ad ogni modo, dev' essere effettuato tutto il lavoro preliminare - la funzione necessaria deve essere overloadata per tutti i tipi di dati con cui dovrebbe funzionare correttamente.
C'è una soluzione conveniente. Se operazioni simili devono essere eseguite per ogni tipo di dati, è possibile utilizzare i modelli di funzione. In questo caso, un programmatore ha bisogno di scrivere solo una descrizione del template funzione. Quando si descrive il template in modo tale, dovremmo specificare solo qualche parametro formale invece di un tipo definito di dati con cui la funzione dovrebbe lavorare. Il compilatore genera automaticamente varie funzioni per la corretta gestione di ogni tipo in base ai tipi di argomenti utilizzati quando si chiama la funzione.
La definizione del template di funzione inizia con la parola chiave template seguita dalla lista dei parametri formali tra parentesi angolari. Ogni parametro formale è preceduto dalla parola chiave typename. I tipi di parametri formali sono di tipo built-in o definiti-dall'utente. Essi sono utilizzati:
- per specificare i tipi di argomenti della funzione,
- per specificare il tipo di valore di ritorno della funzione,
- per dichiarare le variabili all'interno della definizione di funzione
Il numero di parametri del modello non può essere superiore ad otto. Ogni parametro formale nella definizione del modello dovrebbe apparire nella lista dei parametri della funzione almeno una volta. Ogni nome del parametro formale deve essere univoco.
Di seguito è riportato un esempio di un modello di funzione per ricercare il valore più alto nell' array di qualsiasi tipo numerico (numeri interi e reali):
template<typename T>
|
Questo template definisce la funzione che rileva il valore massimo nell'array passato e restituisce questo valore come risultato. Tenete a mente che la funzione ArrayMaximum() costruita in MQL5 restituisce solo l'indice di più alto valore che può essere utilizzato per trovare il valore stesso. Ad esempio:
//--- crea un array
|
Così, abbiamo effettuato due passaggi per ottenere il più alto valore nell'array. Con il template di funzione ArrayMax(), si può ottenere il risultato del tipo necessario semplicemente passando l'array di un tipo appropriato in questa funzione. Significa che invece delle ultime due righe
//--- trova la posizione del valore più elevato nell'array
|
ora è possibile utilizzare una sola riga, in cui il risultato restituito ha lo stesso tipo dell'array passato nella funzione:
//--- trova il valore più alto
|
In questo caso, il tipo di risultato restituito dalla funzione ArrayMax() funzione abbina automaticamente il tipo di matrice.
Utilizzare la parola chiave typename per ottenere il tipo di argomento come stringa al fine di creare i metodi di uso generale di lavoro con diversi tipi di dati. Consideriamo un esempio specifico della funzione che restituisce tipo di dati come una stringa:
#include <Trade\Trade.mqh>
|
Templates di funzioni possono anche essere utilizzati per metodi della classe, per esempio:
class CFile
|
Templates di funzioni non devono essere dichiarati con le parole chiave export, virtual e #import.
Overload della funzione template
Un sovraccarico di funzione template può essere necessario a volte. Per esempio, abbiamo una funzione template che scrive il valore del secondo parametro nel primo utilizzando typecasting. MQL5 non consente typecasting string a bool. Possiamo farlo noi stessi - creiamo un sovraccarico di una funzione template. Per esempio:
//+------------------------------------------------------------------+
|
Come risultato dell'esecuzione del codice, possiamo vedere che la funzione template Assign() è stata utilizzata per la coppia int+string, mentre la versione overload è già stata utilizzata per la coppia string+bool durante la seconda chiamata.
string Assign<int,string>(int&,string)
|
Guarda anche