Sunteți pe pagina 1din 3

20. abloane O caracteristic relativ nou n C++ este ablonul (template). Cu un ablon este posibil s creai funcii generice.

ntr-o funcie sau clas generic, tipul de date asupra cruia opereaz acestea este specificat ca un parametru. De aceea, putei folosi o funcie sau o clas cu mai multe tipuri de date diferite, fr s rescriei versiunile specifice acestora. Funcii generice O funcie generic definete un set general de operaii care vor fi aplicate unor tipuri de date variate. Unei astfel de funcii tipul de date asupra cruia va opera i este transmis ca parametru. Utiliznd acest mecanism, poate fi aplicat aceeai procedur unui domeniu larg de date. Crend o funcie generic, putei defini natura algoritmului, independent de date. O dat fcut acest lucru, atunci cnd se execut funcia, compilatorul genereaz automat codul corect pentru tipul de date folosit efectiv. n esen, cnd creai o funcie generic, creai o funcie care se suprancarc singur, automat. O astfel de funcie este creat cu ajutorul cuvntului cheie template. template <class Tip> tip-retur nume-functie(lista parametri) { //corpul functiei } Tip este un nume care ine locul tipului de date folosite de ctre funcie. Dar, el ine doar un loc pe care compilatorul l va nlocui automat cu tipul de date efectiv, atunci cnd va crea o versiune specific a funciei. #include<iostream.h> template <class X> void inlocuieste(X &a, X &b) { X temp; temp = a; a = b; b = temp; } main() { int i = 10, j = 20; float x = 10.1, y = 20.1; char a = 'x', b = 'z'; inlocuieste(i, j); inlocuieste(x, y); inlocuieste(a, b); cout<<i<<" "<<j<<endl; //output: 20 10 cout<<x<<" "<<y<<endl; //output: 20.1 10.1 cout<<a<<" "<<b<<endl; //output: z x }

O funcie cu dou clase generice #include<iostream.h> template <class tip1, class tip2> void function(tip1 x, tip2 y) { cout<<x<<" "<<y<<endl; } main() { function(10, "hi"); function(0.23, 12L); function('c', " "); return 0; } Suprancrcarea explicit a unei funcii generice Chiar dac o funcie ablon se suprancarc singur cnd este necesar, putei s o suprancrcai i explicit. Dac suprancrcai o funcie generic, atunci ea suprascrie (sau ascunde) funcia generic relativ la acea versiune specific. #include<iostream.h> template <class X> void inloc(X &a, X &b) { X temp; temp = a; a = b; b = temp; } //aceasta surpascrie versiunea genrica a inloc() void inloc(int &a, int &b) { int temp; temp = a; a = b; b = temp; cout<<" in functia inloc(int &, int &) suprascrisa.\n"; } main() { char 'a', 'b'; int 1, 2; inloc('a', 'b'); inloc(1, 2); //aplarea lui inloc() supraincarcat explicit return 0;