|
|
10 2.5 |
operatie
, dar una dintre ele are doi parametri de tip int
, în timp ce cealaltă are doi parametri de tip double
. Compilatorul știe pe care dintre ele să o apeleze analizând tipurile transmise ca argumente la apelul funcției. Dacă este apelată cu două argumente de tip int
, se va executa acea funcție care are parametrii int
, iar dacă este apelată cu două valori de tip double
, se va executa funcția definită cu parametri de tip double
.int
înmulțește argumentele, în timp ce versiunea cu double
le împarte. Aceasta nu este o idee prea bună, în general. De obicei, se așteaptă ca două funcții cu acelasi nume să aibă un comportament asemănător - cel puțin, dar acest exemplu arată că se poate și altfel. Două funcții surpaîncărcate (adică două funcții cu același nume) au definiții complet diferite; întotdeauna, ele sunt două funcții diferite, pentru care doar numele este la fel.
|
|
30 2.5 |
suma
este supraîncărcată cu parametri de tipuri diferite, dar are exact același corp.suma
ar putea fi supraîncărcată pentru o mulțime de tipuri și tot ar avea sens să își păstreze același corp. Pentru asemenea cazuri, C++ are aabilitatea de a permite definirea de funcții cu tipuri generice, prin ceea ce numim șabloane de funcții. Definirea unui șablon de funcții respectă aceeași sintaxă ca și definirea obișnuită a unei funcții, doar că este precedată de cuvântul cheie template
și de o serie de șabloane de parametri incluse între paranteze unghiulare <>:template <sablon-parametri> declaratie-functie
class
sau nume_tip
urmat de un identificator. Acest identificator poate fi folosit ulterior în declarația funcției ca un tip de dată obișnuit. De exemplu, o funcție generică suma
ar putea fi definită astfel:
|
|
class
sau cu nume_tip
(ele sunt sinonime 100% în șablonul de declarații).unTip
(un tip generic în șablonul de parametri inclus între paranteze unghiulare) permite ca unTip
să fie folosit oriunde în definiția funcției, ca orice alt tip; el poate fi folosit ca tip pentru parametri, ca tip returnat sau pentru a declara noi variabile cu acest tip. Întotdeauna, el reprezintă un tip generic ce va fi determinat în momentul ăn care se va instanția șablonul.nume <argumente-sablon> (argumente-functie)
suma
definit mai sus poate fi apelat astfel:
|
|
suma<int>
este doar una dintre posibilele instanțieri ale șablonului de funcție suma
. În acest caz, la folosirea lui int
în apel, compilatorul creează automat o versiune a funcției suma
în care apariția lui unTip
este înlocuită cu int
, ca și cum ar fi fost definită astfel:
|
|
|
|
11 2.5 |
T
ca nume de parametru-șablon, în loc de unTip
. Nu are importanță, căci T
este tot un nume de parametru-șablon pentru tipurile generice. suma
de două ori. Prima dată cu argumente de tip int
, iar a doua oară cu argumente de tip double
. Compilatorul a instanțiat și, apoi, a apelat, de fiecare dată, versiunea potrivită de funcție.T
este folosit și pentru a declara o variabilă locală cu acel tip (generic) în interiorul funcției suma
:
|
|
a
și b
; la fel și tipul returnat de funcție.T
este folosit ca parametru pentru suma
, compilatorul chiar este capabil să deducă automat tipul de date, fără să fie necesară precizarea explicită în interiorul parantezelor unghiulare. De aceea, în loc de explicitarea argumentelor șablonului cu:
|
|
|
|
T
, dacă suma
este apelată cu argumente de tipuri diferite.
|
|
x si y sunt egale |
sunt_egale
:
|
|
|
|
10
) sunt întotdeauna de tip int
, iar constantele reale fără sufix (precum 10.0
) sunt întotdeauna de tip double
, nu există ambiguitate și, de aceea, argumentele șablon pot fi omise la apel.class
sau nume_tip
, ci și expresii de un anumit tip:
|
|
20 30 |
inmultire_fixa
este de tip int
. Arată exact ca un parametru de funcție obișnuit, deci poate fi folosit tot așa.inmultire_fixa
. Așadar, valoarea unui asemenea parametru nu este niciodată transmisă în timpul rulării programului. Cele două apeluri ale lui inmultire_fixa
din main
apelează două versiuni ale funcției: una care dublează, respectiv una care triplează. Exact pentru acest motiv, al doilea argument din șablon trebuie să fie o expresie constantă (nu se poate transmite o variabilă).Previous: Funcții | Index | Next: Vizibilitatea numelor |