Modelli C ++ funzioni

Vota questo articolo





funzione di modelli C ++, funzioni C ++ modelli, template C ++

il tema del piccolo è stato precedentemente considerato overloading di funzioni in C ++. Hai imparato circa l'opportunità di scrivere diverse funzioni con lo stesso nome, che svolgono gli stessi compiti. La differenza principale tra loro – firma (tipi e / o numero di parametri dei parametri). Quando il programma viene avviato, il compilatore sceglierà, quale delle funzioni sovraccaricate applica (supponendo, che passata alla funzione)

Modelli permettono anche funzioni per gestire diversi tipi di dati, trasmessi come parametri. Ma è abbastanza per scrivere una definizione comune di una funzione. Vedi come appare.

funzione di modelli C ++, funzioni C ++ modelli, template C ++

Con la definizione di un modello di funzione che abbiamo usato parole C ++ riservati: modello e typename. modello indica, tale modello sarà ora definito. E tra parentesi angolari dopo typename dato un nome condizionale del tipo di dati. qui, invece del nome T, È possibile assegnare qualsiasi (molto desiderabile corretta) nome.

Successivo è determinata la funzione stessa. Il tipo di ritorno specificare T. parametri: il numero di tipo T, il numero e il tipo di int. Questa funzione trova il numero e la percentuale del valore dei rendimenti del programma. E il numero, e la percentuale passato come parametri. Per esempio il primo parametro si passa a una funzione integer (100). Durante l'avviamento, il compilatore di notare che attualmente T esso int e sostituire le funzioni del modello, tutti questi T di int. Così, la funzione di compilazione ha la forma:

funzione di modelli C ++, funzioni C ++ modelli, template C ++

Noi non vediamo chiaramente, ma funzionerà bene. Qualunque sia il numero, non abbiamo passata a questa funzione come primo parametro, il compilatore crea un'istanza di un modello di funzione per ogni chiamata. Qui, il primo parametro può essere qualsiasi tipo di dati.

Come risultato, lo schermo vedrà il risultato di tale calcolo:funzione di modelli C ++, funzioni C ++ modelli, template C ++

Parlando della definizione di un modello di funzione, Voglio aggiungere, tra parentesi angolari dopo la parola chiave modello possibile registrare diversi nomi convenzionali per i tipi di dati. Perché si vuole? Considerate questo esempio:

È necessario scrivere una funzione, che avrà due numeri, determinare il massimo di loro e tornare nel programma. Cerchiamo di tenere a mente, tale funzione possiamo passare il numero di diversi tipi di. Chance e il caso, un numero è un numero intero, e la seconda – vero. Vedi cosa succede:

Il primo e secondo parametri sono funzione definiti, come i parametri di tipo T. Con la funzione di chiamate in linee 19-20 nessun problema, poiché i parametri di trasferimento sono dello stesso tipo di dati. I problemi sorgono nella riga 22 compilare. E questo è comprensibile. Il compilatore si confonderà. Egli non può convertire il tipo int in raddoppiare.

шаблоны функций c++, шаблоны функций с++, template c++

Per ovviare a questo problema, è necessario scrivere un altro modello.

qui typename T_1 indica il tipo di parametro, che viene trasmesso alla prima caratteristica. typename T_2 indica rispettivamente il tipo del secondo parametro. Questa versione delle funzioni di definizione del modello avvertono errore, conseguente trasmissione di diversi tipi di parametri.

funzione di modelli C ++, funzioni C ++ modelli, template C ++

È importante ricordare,se siete in parentesi angolari dare alcuni nomi per i tipi convenzionali di parametri di funzione (in questo esempio,), tutti questi tipi di nomi devono essere menzionate nella funzione di firma. In caso contrario, non evitare errori durante la compilazione. Per esempio è la definizione di un modello

funzione di modelli C ++, funzioni C ++ modelli, template C ++

Essa porta alle seguenti errori:

шаблоны функций c++, шаблоны функций с++, template c++

Il modello che abbiamo definito le tipologie condizionali T_1 e T_2, e la firma del tipo prescritto solo T_1 .

In pratica, è possibile soddisfare la definizione di un modello di funzione in modo tale, dove invece della parola chiave typename Si usa la parola classe. per esempio:

funzione di modelli C ++, funzioni C ++ modelli, template C ++

è equivalente alla definizione di, abbiamo preso in considerazione

funzione di modelli C ++, funzioni C ++ modelli, template C ++

prima, prima che lo standard C ++ 98, in modelli sempre usato la parola classe. Chi è meglio, quando c'era una parola chiave typename , meglio usarlo. Come è più chiaramente suggerisce, che i nomi T_1 e T_2 Essi rappresentano il tipo.

Per riassumere. La funzione template è progettato per creare una descrizione generalizzata della funzione. Tale funzione può prendere parametri di qualsiasi tipo. Il modello permette al compilatore di generare codice per una funzione specifica, come (o tipi) dati, che è stato sollevato da una chiamata.

Assicuratevi di guardare il video. Informazioni sui modelli con 14 minuti:

Newsletter nuove lezioni sulla programmazione:

14 pensieri su "Modelli C ++ funzioni

  1. questa domanda, ecco un esempio, dove la funzione prende due argomenti a parametri di T1 e T2, hai scritto, che la funzione restituirà il valore più grande di tipo T2, e se sarebbe un numero maggiore di, che è un parametro T1 ? È implicito al tipo T2 con possibile perdita di dati ??

    1. che, nell'esempio illustrato, il valore di ritorno di tipo T1, e se il ritorno T2 secondo tipo, ci sarà una conversione implicita al T1.
      Cosa accade come risultato – è vostra responsabilità di fornire … per esempio, È possibile scrivere una conversione esplicita:

      return static_cast( second );

  2. perché non può essere?

    modello
    T_1 FindMax(int, double B)
    {
    Se (un > B)
    restituire un;
    else if (B > un)
    ritorno b;
    altro
    ritorno 0;
    }

  3. modello
    T_1 FindMax(int, double B)
    {
    Se (un > B)
    restituire un;
    else if (B > un)
    ritorno b;
    altro
    ritorno 0;
    }

  4. che è, quindi perché non può?

    1. pertanto, che vi regole di sintassi, e semplicemente non funzionerà il controllo sintattico.
      A sintattiche regole modelli dicono, che i tipi di modello sono scritti in parentesi angolari.

      1. Sito web ha mangiato un pezzo di codice, perché non può essere?

    1. Quindi è impossibile per molte ragioni:
      – Tipo generici indicati da utilizzare nella firma funzione (questa frase è nel testo)
      – perché il ritorno (ritorno) diversi tipi si sono permessi solo perché, ciò che è incluso conversione automatica ammissibile – si tratta di una cattiva pratica…
      – meglio quando si ritorna a scrivere conversione esplicita:

      – e ancora meglio:

      1. P.S. che, motore forum (mentre?) Mangia tutto, tra parentesi angolari … quindi non è possibile visualizzare la corretta static_cast… , bene, guardare nei libri.

  5. Si prega di notare (non è accentuato nel testo), che tutti, dovuto al template (funzione, classi) ** ** Viene elaborato dal preprocessore, significa il testo makroobrabotki – prima di Miglior C ++ compilare tutti i modelli ha rivelato un codice di conversione.

Lascia un Commento

Inserire il codice nei tag: <pre class="lang:C ++ decodifica:true ">IL TUO CODICE</pre>