Szablony. Szablony funkcji

Podobne dokumenty
Abstrakcyjny typ danych

Szablony funkcji i klas (templates)

Szablony funkcji i szablony klas

Programowanie obiektowe. Wykład 5. C++: szablony

Szablony klas, zastosowanie szablonów w programach

Wprowadzenie do szablonów szablony funkcji

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Wprowadzenie do szablonów szablony funkcji

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

PARADYGMATY PROGRAMOWANIA Wykład 4

Wstęp do Programowania 2

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wprowadzenie do szablonów klas

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

C++ Przeładowanie operatorów i wzorce w klasach

Programowanie w języku C++

Zaawansowane programowanie w C++ (PCP)

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wstęp do programowania obiektowego, wykład 7

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Identyfikacje typu na etapie. wykonania (RTTI)

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

TEMAT : KLASY DZIEDZICZENIE

Laboratorium nr 10. Temat: Funkcje cz.2.

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Języki i techniki programowania Ćwiczenia 4 Wzorce

Przeciążenie (przeładowanie nazw) funkcji

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

#include <iostream.h> #include <conio.h>

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Wykład 4: Klasy i Metody

Wstęp do programowania

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Język C, tablice i funkcje (laboratorium, EE1-DI)

Programowanie Komputerów

Stos liczb całkowitych

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Wzorce funkcji (szablony)

Programowanie obiektowe w C++ Wykład 12

Wyjątki (exceptions)

Programowanie generyczne w C++

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Część 4 życie programu

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Programowanie proceduralne w języku C++ Funkcje

Podstawy programowania skrót z wykładów:

Paradygmaty programowania

Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Język C++ wykład VIII

4. Funkcje. Przykłady

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony

Efekty uboczne błędów

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

TEMAT : KLASY POLIMORFIZM

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Metody Metody, parametry, zwracanie wartości

Język C zajęcia nr 11. Funkcje

Język C++ zajęcia nr 2

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

Wstęp do informatyki- wykład 11 Funkcje

MATERIAŁY DO ZAJĘĆ II

Programowanie obiektowe 2005/2006. Laboratorium 1. Przeciążanie funkcji

Wykład 5: Klasy cz. 3

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Funkcje i klasy zaprzyjaźnione

Klasyfikacja wyjątków

PARADYGMATY PROGRAMOWANIA Wykład 2

Wartości domyślne, szablony funkcji i klas

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

I - Microsoft Visual Studio C++

Programowanie 2. Język C++. Wykład 3.

Programowanie - wykład 4

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Programowanie i struktury danych

Transkrypt:

Szablony Szablony sa mechanizmem ponownego wykorzystania kodu (reuse) W przypadku funkcji ponownie wykorzystany jest algorytm W przypadku klas ponownie wykorzystane sa wszystkie skladowe Deklaracja szablonu specyfikuje zbiór parametryzowanych klas lub funkcji Szablony funkcji Deklaracja szablonu ma postac: template < [typelist] [, [arglist]] > declaration Lista parametrów szablonu jest oddzielona przecinkami (lista typów, identyfikatorów klas lub nazw typów) oraz ewentualnie wartości, które mają być wykorzystane w treści szablonu Przykład szablonu funkcji: template <typename T> T mmin( T a, T b ) { return ( a < b )? a : b; }

Użycie szablonu wymaga jego konkretyzacji (ustalenia wartości dla wszystkich generycznych parametrów) Konkretyzacja może odbywać się: Niejawnie (na podstawie typów parametrów aktualnych) Jawnie (przez podanie typów parametrów aktualnych) Niejawna konkretyzacja funkcji ma miejsce w czasie jej wywołania; wartości parametrów generycznych są ustalane na podstawie parametrów aktualnych Przykład niejawnej konkretyzacji szablonu funkcji min: int a = 5, b = 10; double a = 5.0, b = 10.0; cout << mmin(a,b); cout << mmin(a,b); Jawna konkretyzacja wymaga, aby, a po nazwie funkcji, w nawiasach <>, zdefiniowac wartosci aktualne dla parametrów generycznych Przykład jawnej konkretyzacji szablonu funkcji: char x= a ; int y = 66; cout << mmin<char>(x,y); // wymagana konwersja z int do char

Specjalizacja szablonu Szablony można specjalizować, zmieniając ich działanie w zależności od typu parametrów, na którym działają template <typename T> void Demo( T a ) {} // definicja funkcji szablonowej template<> void Demo[<typ>](typ a) {} // specjalizacja szablonu dla //konkretnego typu Przyklady róznych specjalizacji szablonów: template <typename T> void f(t t) { cout << "Wersja ogolna \n"; } template <> void f<char>(char t) // specjalizacja funkcji f dla { cout << "Wersja char \n"; } // typu char template <> void f(double t){} // specjalizacja funkcji f dla typu // double

template <typename T, typename I> void Demo( T a, I b ) { cout << "Any \n"; } template <typename I> void Demo<>(double a, I b) { cout << "Double \n"; } Parametrem szablonu moze byc argument, który nie jest typem. Argumenty, które nie opisują typów (non-type) podlegaja nastepujacym ograniczeniom: Typ argumentu jest typem calkowitym, wyliczeniowym, referencją lub wskaznikiem W kodzie szablonu nie mozna modyfikowac wartosci argumentu, ani pobierać jego adresu Przy konkretyzacji szablonu wartosc parametru musi byc stałą Przyklad szablonu funkcji z parametrem, który nie jest typem: template<class T, int zakres> int szukaj(t tablica[], T co){} const int ile = sizeof(tab1) / sizeof(int); cout << szukaj<int, ile>(tab1,2) << endl;

Zastosowanie szablonów funkcji dla własnych typów (klas) może wymagać przeciążenia odpowiednich operatorów: template <class T> T min(t a, T b) { return( a < b )? a : b; } class X { public: int a, b; }; X(int a=0):a(a){}; int operator<( X &other) { return a < other.a; }; X a,b,c; c = min(a,b);

Kolejność dopasowywania wywołań funkcji szablonowych przez kompilator (mechanizm rozstrzygania przeciazen): Tworzona jest lista funkcji kandydujących o tej samej nazwie Spośród funkcji kandydujacych wybierane są te, które mają odpowiednią listę parametrów istnieje niejawna sekwencja konwersji, zawierajaca przypadek dokładnego dopasowania każdego typu parametru aktualnego do typu odpowiedniego parametru formalnego Sposród różnych funkcji, wybierana jest taka, której argumenty są najlepiej dopasowane (zwykłe funkcje maja pierwszeństwo przed wzorcami, konwersja przez promocję, np. char lub short w int, float w double, konwersja standardowa, np. int w char, long w double, konwersja zdefiniowana przez użytkownika) Jeżeli uda sie znaleźć szablon - generowana jest odpowiednia wersja funkcji Jeżeli szablonu nie uda sie znaleźć zgłaszany jest błąd kompilacji

Szablony klas Szablon klasy służy do tworzenia rodziny klas, które operują na pewnym typie (typach) - parametrach szablonu template <typename T, int i> class TempClass { public: TempClass(void); ~TempClass(void); int MemberSet( T a, int b ); private: T Tarray[i]; int arraysize; }; Szablon klasy ma 2 parametry, 1-szy typ T, 2-gi wartość typu int Wartością aktualną T może być dowolny typ Wartością aktualną drugiego parametru może być stała int

Definicja funkcji klasy szablonowej: template<deklaracja_parametrów_szablonu> typ_wyniku nazwa_klasy<param_szablonu>::nazwa_skladowej([param]) {... } Przyklad definicji klasy szablonowej: template <class T, int i> int TempClass<T, i>::memberset(t a, int b) { if( b >= 0 && b < arraysize ) return ( Tarray[b] = a ); else return -1; } Konkretyzacja klasy szablonowej może byc: niejawna (przy deklarowani obiektów z szablonu klasy), jawna (tworzenie konkretu klasy bez natychmiastowego wykorzystania, np. w bibliotekach)

Konkretyzacja niejawna klasy szablonowej ma postać (konkretyzacja niejawna): klasa_szablonowa<parametry_aktualne> obiekt_klasy_konkretnej; Przyklad konkretyzacji klasy szablonowej (konkretyzacja niejawna): TempClass<int, 10> klasa1; // parametry aktualne szablonu: int, 10 TempClass<char, 5> klasa2; // parametry aktualne szablonu: char, 5 Konkretyzacja klasy szablonowej ma postać (konkretyzacja jawna): template class klasa_szablonowa<parametry_aktualne>; Przyklad konkretyzacji klasy szablonowej (konkretyzacja jawna): template class TempClass<char, 3>; // parametry aktualne szablonu: char, 3 template class Klasa<int>; // parametry aktualne szablonu: int

Taka deklaracja musi być umieszczona w tej samej przestrzeni nazw, co definicja szablonu; Klasa jest generowana zawsze, nawet, gdy nie tworzymy obiektów tej klasy Zostaną wygenerowane klasy: TempClass<char,3> Klasa<int> Szablon klasy moze definiowac domyślne parametry typu: template <class T2 = typ> deklaracja template <typename T = char> class Kwadrat { void rysuj( T znak ){} }; Mozliwe konkretyzacje takiego szablonu: Kwadrat<int> klasa1(4); klasa1.rysuj(4); Kwadrat<> klasa2(5); // wykorzystanie typu domyslnego klasa2.rysuj('*');

Szablony są często uzywane: Do tworzenia klas obslugujacych kolekcje (np. stos), które manipuluja na danych dowolnych typów Jako klasy bazowe, jak i typy obiektów skladowych Zalety szablonów: latwe do napisania latwe do zrozumienia type-safe - kompilator wykonuje wszelkie niezbedne sprawdzenia parametrów Szablony znacząco redukują rozmiar kodu źródlowego i zwiększają jego elastyczność nie zmniejszając bezpieczenstwa związanego ze sprawdzaniem typów