Wprowadzenie do szablonów szablony funkcji
Bogdan Kreczmer
ZPCiR IIAiR PWr
pokój 307 budynek C3
bogdan.kreczmer@pwr.wroc.pl
Copyright ©2006 2010 Bogdan Kreczmer
Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępniony pod
warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z
niniejszą stroną tytułową.
1
Separacja kodu i typów
W językach takich jak C i Pascal mamy do czynienia z separacją kodu i typu parame-
trów. Wartości z jakimi wywoływane są funkcje i procedury mogą parametryzować ich
działanie. Jednak ich typy zostają ustalone raz na zawsze w momencie ich definicji.
Wprowadzenie do szablonów szablony funkcji
1
Separacja kodu i typów
W językach takich jak C i Pascal mamy do czynienia z separacją kodu i typu parame-
trów. Wartości z jakimi wywoływane są funkcje i procedury mogą parametryzować ich
działanie. Jednak ich typy zostają ustalone raz na zawsze w momencie ich definicji.
Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów.
Wprowadzenie do szablonów szablony funkcji
1
Separacja kodu i typów
W językach takich jak C i Pascal mamy do czynienia z separacją kodu i typu parame-
trów. Wartości z jakimi wywoływane są funkcje i procedury mogą parametryzować ich
działanie. Jednak ich typy zostają ustalone raz na zawsze w momencie ich definicji.
Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów.
Możliwe rozwiązania:
Wprowadzenie do szablonów szablony funkcji
1
Separacja kodu i typów
W językach takich jak C i Pascal mamy do czynienia z separacją kodu i typu parame-
trów. Wartości z jakimi wywoływane są funkcje i procedury mogą parametryzować ich
działanie. Jednak ich typy zostają ustalone raz na zawsze w momencie ich definicji.
Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów.
Możliwe rozwiązania:
" Implementacja algorytmu dla wszystkich typów, dla których przewidziane jest jego
zastosowanie.
Wprowadzenie do szablonów szablony funkcji
1
Separacja kodu i typów
W językach takich jak C i Pascal mamy do czynienia z separacją kodu i typu parame-
trów. Wartości z jakimi wywoływane są funkcje i procedury mogą parametryzować ich
działanie. Jednak ich typy zostają ustalone raz na zawsze w momencie ich definicji.
Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów.
Możliwe rozwiązania:
" Implementacja algorytmu dla wszystkich typów, dla których przewidziane jest jego
zastosowanie.
" Implementacja algorytmu dla typu podstawowego takiego jak void" lub Object.
Wprowadzenie do szablonów szablony funkcji
1
Separacja kodu i typów
W językach takich jak C i Pascal mamy do czynienia z separacją kodu i typu parame-
trów. Wartości z jakimi wywoływane są funkcje i procedury mogą parametryzować ich
działanie. Jednak ich typy zostają ustalone raz na zawsze w momencie ich definicji.
Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów.
Możliwe rozwiązania:
" Implementacja algorytmu dla wszystkich typów, dla których przewidziane jest jego
zastosowanie.
" Implementacja algorytmu dla typu podstawowego takiego jak void" lub Object.
" Zdefiniowanie makr i wykorzystanie specjalnych preprocesorów (np. cpp dla
C/C++).
Wprowadzenie do szablonów szablony funkcji
1
Separacja kodu i typów
W językach takich jak C i Pascal mamy do czynienia z separacją kodu i typu parame-
trów. Wartości z jakimi wywoływane są funkcje i procedury mogą parametryzować ich
działanie. Jednak ich typy zostają ustalone raz na zawsze w momencie ich definicji.
Problem: Należy zaimplementować algorytm sortowania dla obiektów różnych typów.
Możliwe rozwiązania:
" Implementacja algorytmu dla wszystkich typów, dla których przewidziane jest jego
zastosowanie.
" Implementacja algorytmu dla typu podstawowego takiego jak void" lub Object.
" Zdefiniowanie makr i wykorzystanie specjalnych preprocesorów (np. cpp dla
C/C++).
Najlepszym rozwiÄ…zaniem dla postawionego problemu jest koncepcja
szablonów.
Wprowadzenie do szablonów szablony funkcji
2
Podstawowe cechy
" Szablony pozwalają na definiowanie funkcji, których typy
parametrów są także parametrami tych funkcji.
Wprowadzenie do szablonów szablony funkcji
2
Podstawowe cechy
" Szablony pozwalają na definiowanie funkcji, których typy
parametrów są także parametrami tych funkcji.
" Możliwe jest definiowanie klas, które parametryzowane
mogą być typami pól występujących w tych klasach i/lub
też typami parametrów metod.
Wprowadzenie do szablonów szablony funkcji
2
Podstawowe cechy
" Szablony pozwalają na definiowanie funkcji, których typy
parametrów są także parametrami tych funkcji.
" Możliwe jest definiowanie klas, które parametryzowane
mogą być typami pól występujących w tych klasach i/lub
też typami parametrów metod.
" Programista definiuje tylko raz dany szablon. Kompilator
dokonuje dedukcji typów parametrów danego szablonu i
konkretyzuje go tworząc kod dla użytych typów w wywoła-
niu funkcji lub definicji obiektu danej klasy.
Wprowadzenie do szablonów szablony funkcji
2
Podstawowe cechy
" Szablony pozwalają na definiowanie funkcji, których typy
parametrów są także parametrami tych funkcji.
" Możliwe jest definiowanie klas, które parametryzowane
mogą być typami pól występujących w tych klasach i/lub
też typami parametrów metod.
" Programista definiuje tylko raz dany szablon. Kompilator
dokonuje dedukcji typów parametrów danego szablonu i
konkretyzuje go tworząc kod dla użytych typów w wywoła-
niu funkcji lub definicji obiektu danej klasy.
" Programista może też jawnie określić wartości parame-
trów szablonu.
Wprowadzenie do szablonów szablony funkcji
3
Podstawowe cechy
Zalety:
Wprowadzenie do szablonów szablony funkcji
3
Podstawowe cechy
Zalety: Szablony dają możliwość tworzenia uniwersalnych
algorytmów i uniwersalnych struktur danych.
Wprowadzenie do szablonów szablony funkcji
3
Podstawowe cechy
Zalety: Szablony dają możliwość tworzenia uniwersalnych
algorytmów i uniwersalnych struktur danych.
W odróżnieniu od makr możliwe jest zachowanie
przejrzystości kodu.
Wprowadzenie do szablonów szablony funkcji
3
Podstawowe cechy
Zalety: Szablony dają możliwość tworzenia uniwersalnych
algorytmów i uniwersalnych struktur danych.
W odróżnieniu od makr możliwe jest zachowanie
przejrzystości kodu.
W odróżnieniu od wykorzystywania typów bazowych
pozwalają zachować ścisłą kontrolę typów w trakcie
kompilacji.
Wprowadzenie do szablonów szablony funkcji
3
Podstawowe cechy
Zalety: Szablony dają możliwość tworzenia uniwersalnych
algorytmów i uniwersalnych struktur danych.
W odróżnieniu od makr możliwe jest zachowanie
przejrzystości kodu.
W odróżnieniu od wykorzystywania typów bazowych
pozwalają zachować ścisłą kontrolę typów w trakcie
kompilacji.
Wady:
Wprowadzenie do szablonów szablony funkcji
3
Podstawowe cechy
Zalety: Szablony dają możliwość tworzenia uniwersalnych
algorytmów i uniwersalnych struktur danych.
W odróżnieniu od makr możliwe jest zachowanie
przejrzystości kodu.
W odróżnieniu od wykorzystywania typów bazowych
pozwalają zachować ścisłą kontrolę typów w trakcie
kompilacji.
ć% Brak możliwości tworzenia oddzielnych jednostek
Wady: kompilacji (modułów) w postaci czystych szablo-
nów.
Wprowadzenie do szablonów szablony funkcji
4
Szablon funkcji
template
Typ max( Typ w1, Typ w2 )
{
return w1}
enum Symbole { a=1, b, c };
int main( )
{
cout << max(1,2) << endl;
cout << max(1.1, 2.2) << endl;
cout << max( A , B ) << endl;
cout << max( a , b ) << endl;
}
Wprowadzenie do szablonów szablony funkcji
4
Szablon funkcji
template
Typ max( Typ w1, Typ w2 )
{
return w1}
enum Symbole { a=1, b, c };
int main( )
{
cout << max(1,2) << endl;
Wynik działania:
cout << max(1.1, 2.2) << endl;
2
cout << max( A , B ) << endl;
2.2
B
cout << max( a , b ) << endl;
}
2
Wprowadzenie do szablonów szablony funkcji
4
Szablon funkcji
template
Typ max( Typ w1, Typ w2 )
{
return w1}
enum Symbole { a=1, b, c };
int main( )
{
cout << max(1,2) << endl;
Wynik działania:
cout << max(1.1, 2.2) << endl;
2
cout << max( A , B ) << endl;
2.2
B
cout << max( a , b ) << endl;
}
2
W tym przykładzie kompilator generuje kod funkcji max dla czterech przypadków. Słowo kluczowe
class może zostać zastąpione przez typename.
Wprowadzenie do szablonów szablony funkcji
5
Szablon funkcji
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( float x = 0, float y = 0 ): x(x), y(y) { }
bool operator<( const Wektor& W ) const
{ return x" x+ y" y}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
template
Typ max( Typ w1, Typ w2 )
{
return w1}
int main( )
{
Wektor W1(1,1), W2(-2,1);
W1 = max( W1, W2 );
cout << W1. x << , << W1. y << endl;
}
Wprowadzenie do szablonów szablony funkcji
5
Szablon funkcji
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( float x = 0, float y = 0 ): x(x), y(y) { }
bool operator<( const Wektor& W ) const
{ return x" x+ y" y}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
template
Typ max( Typ w1, Typ w2 )
{
return w1}
int main( )
{
Wektor W1(1,1), W2(-2,1);
W1 = max( W1, W2 );
cout << W1. x << , << W1. y << endl;
Wynik działania:
}
-2, 1
Wprowadzenie do szablonów szablony funkcji
5
Szablon funkcji
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( float x = 0, float y = 0 ): x(x), y(y) { }
bool operator<( const Wektor& W ) const
{ return x" x+ y" y}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
template
Typ max( Typ w1, Typ w2 )
{
return w1}
int main( )
{
Wektor W1(1,1), W2(-2,1);
W1 = max( W1, W2 );
cout << W1. x << , << W1. y << endl;
Wynik działania:
}
-2, 1
Szablon funkcji można wykorzystywać dla własnych klas, o ile wszystkie realizowane w nim operacje
będą legalne.
Wprowadzenie do szablonów szablony funkcji
6
Szablon funkcji
template
Typ max( Typ w1, Typ w2 )
{
return cout << S: , w1}
const char" max( const char" s1, const char" s2 )
{
return cout << F: , std::strcmp(s1,s2)<0 ? s2 : s1;
}
int main( )
{
cout << max( Abacki , Kowalski ) << endl;
cout << max( Abacki , Kowalski ) << endl;
cout << max<>( Abacki , Kowalski ) << endl;
}
Wprowadzenie do szablonów szablony funkcji
6
Szablon funkcji
template
Typ max( Typ w1, Typ w2 )
{
return cout << S: , w1}
const char" max( const char" s1, const char" s2 )
{
return cout << F: , std::strcmp(s1,s2)<0 ? s2 : s1;
}
int main( )
{
cout << max( Abacki , Kowalski ) << endl;
cout << max( Abacki , Kowalski ) << endl;
cout << max<>( Abacki , Kowalski ) << endl;
}
Wynik działania:
F: Kowalski
S: Abacki
S: Abacki
Wprowadzenie do szablonów szablony funkcji
6
Szablon funkcji
template
Typ max( Typ w1, Typ w2 )
{
return cout << S: , w1}
const char" max( const char" s1, const char" s2 )
{
return cout << F: , std::strcmp(s1,s2)<0 ? s2 : s1;
}
int main( )
{
cout << max( Abacki , Kowalski ) << endl;
cout << max( Abacki , Kowalski ) << endl;
cout << max<>( Abacki , Kowalski ) << endl;
}
Wynik działania:
F: Kowalski
S: Abacki
S: Abacki
Funkcje zdefiniowane przez szablony mogą być przeciążone zwykłymi funkcjami. Można jednak
wymusić użycie funkcji zdefiniowanej przez szablon.
Wprowadzenie do szablonów szablony funkcji
7
Szablon funkcji
template
Typ max( Typ w1, Typ w2 )
{
return cout << S: , w1}
template<>
const char " max(const char " s1, const char " s2)
{
return cout << F: , std::strcmp(s1,s2)<0 ? s2 : s1;
}
int main( )
{
cout << max( Abacki , Kowalski ) << endl;
cout << max( Abacki , Kowalski ) << endl;
cout << max<>( Abacki , Kowalski ) << endl;
}
Wprowadzenie do szablonów szablony funkcji
7
Szablon funkcji
template
Typ max( Typ w1, Typ w2 )
{
return cout << S: , w1}
template<>
const char " max(const char " s1, const char " s2)
{
return cout << F: , std::strcmp(s1,s2)<0 ? s2 : s1;
}
int main( )
{
cout << max( Abacki , Kowalski ) << endl;
cout << max( Abacki , Kowalski ) << endl;
cout << max<>( Abacki , Kowalski ) << endl;
}
Wynik działania:
F: Kowalski
F: Kowalski
F: Kowalski
Wprowadzenie do szablonów szablony funkcji
7
Szablon funkcji
template
Typ max( Typ w1, Typ w2 )
{
return cout << S: , w1}
template<>
const char " max(const char " s1, const char " s2)
{
return cout << F: , std::strcmp(s1,s2)<0 ? s2 : s1;
}
int main( )
{
cout << max( Abacki , Kowalski ) << endl;
cout << max( Abacki , Kowalski ) << endl;
cout << max<>( Abacki , Kowalski ) << endl;
}
Wynik działania:
F: Kowalski
F: Kowalski
F: Kowalski
Można tworzyć specjalizację szablonu funkcji dla wybranego typu.
Wprowadzenie do szablonów szablony funkcji
Wyszukiwarka
Podobne podstrony:
09 szablony klas
09 prez niezalezność liniowa
pref 09
amd102 io pl09
2002 09 Creating Virtual Worlds with Pov Ray and the Right Front End
Analiza?N Ocena dzialan na rzecz?zpieczenstwa energetycznego dostawy gazu listopad 09
2003 09 Genialne schematy
09 islam
GM Kalendarz 09 hum
więcej podobnych podstron