Podstawy informatyki Szablony funkcji Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka
Funkcja zwracająca większą wartość int wieksza(int a,int b) { return (a > b) ? a : b; } int main() { int a,b; a=5; b=2; cout<<wieksza(a,b)<<endl; double c,d; c=2.5; d=2.2; cout<<wieksza(c,d)<<endl; return 0; } 5 2
ctrl+c, ctrl+v int wieksza(int a,int b) { return (a > b) ? a : b; } double wieksza(double a,double b) { return (a > b) ? a : b; } int main() { int a,b; a=5; b=2; cout<<wieksza(a,b)<<endl; double c,d; c=2.5; d=2.2; cout<<wieksza(c,d)<<endl; return 0; } 5 2.5
Szablon funkcji template typ wieksza(typ a, typ b) { return (a > b) ? a : b; } int main() { int a,b; a=5; b=2; cout<<wieksza(a,b)<<endl; double c,d; c=2.5; d=2.2; cout<<wieksza(c,d)<<endl; return 0; } Parametr szablonu Argumenty funkcji
Funkcje szablonowe Kompilator generuje funkcję szablonową gdy: wywołujemy funkcję, odwołujemy się do jej adresu. Funkcja szablonowa z jednym zestawem parametrów generowana jest tylko raz. Podobnie jak w przypadku przeładowań nazw funkcji typ rezultatu funkcji się nie liczy.
Kilka przykładów template typ1 wieksza(typ1 a, typ2 b, typ1 c) {…} template typ wieksza(typ a, typ *b) {…} template typ wieksza(typ a, int b) {…} template typ_w wieksza(typ1 a, typ2 b, typ1 c, typ_w) {...}
Problemy z typami definiowanymi template typ wieksza(typ a, typ b) { return (a > b) ? a : b; } class zespolona { public: double re,im; }; int main() { zespolona A,B; A.re=5; A.im=2; B.re=1; B.im=3; cout<<wieksza(A,B)<<endl; return 0; }
Problemy z typami wbudowanymi template double funkcja(typ a) { double m=a.modul(); return m; } class zespolona { public: double re,im; double modul(){ return sqrt(re*re+im*im);} }; int main() { zespolona A; A.re=5; A.im=2; cout<<funkcja(A)<<endl; cout<<funkcja(1)<<endl; return 0; }
Funkcja specjalizowana template typ wieksza(typ a, typ b) { cout<<"Funkcja szablonowa\n"; return (a > b) ? a : b; } int wieksza(int a,int b) { cout<<"Funkcja specjalizowana\n"; return (a > b) ? a : b; } int main() { cout<<wieksza(1,2)<<endl; cout<<wieksza(1.5,2.7)<<endl; return 0; } 2 2.7
Kolejność argumentów funkcji template typ1 wieksza(typ1 a, typ2 b) { return (a > b) ? a : b; } int main() { double a=3.5; int b=2; cout<<wieksza(a,b)<<endl; cout<<wieksza(b,a)<<endl; return 0; } 3.5 3
Konflikt template typ1 wieksza(typ1 a, typ2 b) { return (a > b) ? a : b; } template typ2 wieksza(typ1 a, typ2 b) { return (a > b) ? a : b; } Szablony różnią się tylko typem zwracanym
Obiekty lokalne typu typ template typ dzialanie(typ a, typ b) { typ w; w=3*a+b; return w; } int main() { int a=3; int b=2; cout<<dzialanie(a,b)<<endl; return 0; } 11
Typy pochodne template void zmiana(typ &a, typ &b) { typ c=a; a=b; b=c; } int main() { int a=3; int b=2; cout<<a<<b<<endl; zmiana(a,b); cout<<a<<b<<endl; return 0; } 32 23
Typy pochodne template void zmiana(typ &a, typ &b) { typ c=a; a=b; b=c; } int main() { char *a="AAA"; char *b="BBB"; cout<<a<<b<<endl; zmiana(a,b); cout<<a<<b<<endl; return 0; } AAABBB BBBAAA
Szablon generujący funkcje inline template inline typ wieksza(typ a, typ b) { return (a > b) ? a : b; }
Obiekty lokalne statyczne template void funkcja(typ a) { static int licznik=0; licznik++; cout<<licznik<<endl; } int main() { funkcja(1); funkcja(1.0); funkcja(5); funkcja('a'); return 0; }
Run-Time Type Identyfication #include using namespace std; template void funkcja(typ a) { cout<<typeid(a).name()<<endl; } int main() { funkcja(1); funkcja(1.0); funkcja(5); funkcja('a'); return 0; } int double int char
Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie: