1 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
2 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
3 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
4 Szablon funkcji template typ wieksza(typ a, typ b) { return (a > b) ? a : b; } int main() { int a,b; a=5; b=2; cout
5 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.
6 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) {...}
7 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
8 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
9 Funkcja specjalizowana template typ wieksza(typ a, typ b) { cout
10 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
11 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
12 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
13 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
14 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
15 Szablon generujący funkcje inline template inline typ wieksza(typ a, typ b) { return (a > b) ? a : b; }
16 Obiekty lokalne statyczne template void funkcja(typ a) { static int licznik=0; licznik++; cout
17 Run-Time Type Identyfication #include using namespace std; template void funkcja(typ a) { cout
18 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: http://creativecommons.org/licenses/by-sa/3.0/deed.pl