PROGRAMOWANIE GENERYCZNE W JĘZYKU C++

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

Szablony funkcji i klas (templates)

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

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

Zaawansowane programowanie w C++ (PCP)

Standard C++0x (C++1x?) Marcin Świderski

Szablony funkcji i szablony klas

Zaawansowane programowanie w C++ (PCP)

Wprowadzenie do szablonów klas

Wprowadzenie do szablonów szablony funkcji

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

Wprowadzenie do szablonów szablony funkcji

Szablony. Szablony funkcji

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

Wydajność użycia funktorów z biblioteką STL języka C++

Programowanie Komponentowe Zarządzanie obiektami: kontenery

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

Języki i techniki programowania Ćwiczenia 4 Wzorce

ALGORYTMY I STRUKTURY DANYCH

Szablony klas, zastosowanie szablonów w programach

Paradygmaty programowania

Algorytmy i Struktury Danych. Anna Paszyńska

Spis treści. Wprowadzenie 15

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Curiously recurring template pattern

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

Metody Metody, parametry, zwracanie wartości

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

Paradygmaty programowania. Paradygmaty programowania

Zaawansowane programowanie w C++ (PCP)

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

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

obiekty funkcyjne - funktory

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

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

TEMAT : KLASY DZIEDZICZENIE

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Szablon klasy std::list

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

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

Programowanie w C++ z użyciem kontenerów - parę przykładów programów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

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

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

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

Programowanie obiektowe

Programowanie Obiektowe i C++

Wstęp do programowania obiektowego Szablony w C++ 1

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

C++ - szablony kontenerów. Kontenery i szablony kontenerów. C++ - szablony kontenerów. C++ - szablony kontenerów. C++ - szablony kontenerów

Język C++ wykład VIII

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Podstawy Programowania Obiektowego

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

Programowanie i struktury danych

Kurs programowania. Wykład 9. Wojciech Macyna

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

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

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

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

Programowanie generyczne w C++

Materiały do zajęć VII

Język ludzki kod maszynowy

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java Język programowania

Wstęp do Programowania, laboratorium 02

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Abstrakcyjny typ danych

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

Imię i nazwisko: PYTANIA I ODPOWIEDZI Nr 0 EGZAMIN Język C++ 27 czerwca 2011

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Boost, Metaprogramowanie, Inne biblioteki

Część I Programowanie niskiego poziomu w języku C 19

Funkcja (podprogram) void

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

10.1 Szablony Szablony funkcji Szablony klas Szablony jako wstęp do biblioteki STL... 10

6 Niektóre nowe cechy standardu C++11

Programowanie obiektowe C++

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

Wykład 4: Klasy i Metody

Język C++ część 9 szablony klas. Jarosław Gramacki Instytut Informatyki i Elektroniki. szablony funkcji

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Robert Kawulak C++09. Co nowego w nadchodzącym standardzie języka?

Obsługa wyjątków. Język C++ WW12

Wskaźniki do funkcji i metod

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Polimorfizm. dr Jarosław Skaruz

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Polimorfizm, metody wirtualne i klasy abstrakcyjne

STL: kontenery. STL: kontenery. STL: kontenery. Typy kontenerów STL. STL: kontenery. STL: kontenery. multimap. Kontener map: przykład zadanie:

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

Projektowanie algorytmów rekurencyjnych

Przeciążanie operatorów

Programowanie obiektowe

STL: implementowanie algorytmów C++: STL. STL: implementowanie algorytmów. STL: implementowanie algorytmów. STL: implementowanie algorytmów

Interfejsy i klasy wewnętrzne

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Transkrypt:

PROGRAMOWANIE GENERYCZNE W JĘZYKU C++ Krzysztof Rogala Instytu Automatyki i Informatyki Stosowanej Wydział Elektroniki i Technik Informacyjnych Politechniki Warszawskiej

CZYM JEST PROGRAMOWANIE GENERYCZNE? Tworzenie ogólnego kodu, który może byd ukonkretniany w przyszłości. Ukonkretnienie polega na: określeniu typów danych, na których kod operuje, podaniu dodatkowych parametrów algorytmu.

SZABLONY JĘZYKA C++ Szablony klas: template<typename T, int N> class Tablica { T m_tablica[n]; Szablony funkcji: template<typename T> bool less(const T& arg1, const T& arg2) { return arg1 < arg2; Ukonkretnienie: Tablica<int, 10> tablicaint; if(less(10, 12)) printf("10 < 12");

STL STANDARD TEMPLATE LIBRARY Standardowa biblioteka, definiująca m.in. ogólne kontenery i algorytmy, np.: std::set - posortowany zbiór zawierający elementy bez powtórzeo: template<typename T> struct ComplexComparator { bool operator()(const std::complex<t>& c1, const std::complex<t>& c2) { if(c1.real() == c1.real()) return c1.imag() < c2.imag(); else return c1.real() < c2.real(); std::set<std::complex<float>, ComplexComparator<float> > complexset; przykład algorytmu kopiowanie sekwencji: std::set<std::complex<float>, ComplexComparator<float> > complexset1; std::set<std::complex<float>, ComplexComparator<float> > complexset2; std::copy(complexset1.begin(), complexset1.end(), complexset2.begin());

CIEKAWSZY PRZYKŁAD Funkcja wypisująca zawartośd dowolnego kontenera, przechowującego dowolny typ: template<typename CONT> void print(const CONT& cont) { typedef typename std::iterator_traits<cont::iterator>::value_type VT; std::copy(cont.begin(), cont.end(), std::ostream_iterator<vt>(std::cout, " ")); Przykład użycia: std::set<int> intset; intset.insert(1); intset.insert(2); intset.insert(3); print(intset);

AUTOMATYCZNE GENEROWANIE KODU 1 boost::bind dotychczasowy sposób wykonywania operacji na elementach kontenera: struct FunctionObject { void operator()(int x) { x += 5; std::set<int> intset; std::set<int>::iterator iter1 = intset.begin(); auto iter2 = --intset.end(); FunctionObject fn; std::for_each(iter1, iter2, fn); natomiast z wykorzystaniem boost::bind: void fun(int x, int y) { x += y; std::for_each(iter1, iter2, boost::bind(fun, _1, 5));

AUTOMATYCZNE GENEROWANIE KODU 2 wyrażenia lambda Prosty przykład generowania nienazwanej funkcji: [](int x, int y) -> int { int z = x + y; return z + x; Wyrażenie to generuje następujący kod: class XXX { public: int operator()(int x, int y) { int z = x + y; return z; następnie zwracany jest obiekt utworzonego typu (jego nazwa jest nieznana).

WYRAŻENIA LAMBDA I STL Ponieważ wyrażenie lambda zwraca obiekt, można go urzyd jako parametr algorytmu z STL. Przykład pokazuje obliczanie sumy wszystkich elementów zbioru: std::set<int> intset; int total = 0; std::for_each ( somelist.begin(), somelist.end(), [&](int x) { total += x; ); Warto zauważyd, że cały kod generowany jest podczas kompilacji, a zatem nie powoduje żadnych nakładów na czas wykonania. Stosowanie wyrażeo lambda i boost::bind znacznie spowalnia czas kompilacji, natomiast nie ma żadnego wpływu na czas wykonania programu. Jedyną istotną różnicą jest fakt, że obiekty tworzone są jedynie na czas wywołania algorytmu. auto myfunobj = [&total](int x) { total += x;

WERYFIKACJA POPRAWNOŚCI KONCEPTÓW Koncept: wzorzec definiujący sposób implementowania klas, wykonujących konkretne zadania. Przykład: Iterator Koncept dwukierunkowego iteratora określa, że jest to klasa implementująca podstawowe operacje typowe dla wskaźnika: operatory ++ i --, operator * i ->. Przykład z STL: void foo() { std::list<int> intlist; std::stable_sort(intlist.begin(), intlist.end()); return 0; Powyższy kod nie skompiluje się, jednak z komunikatów o błędzie nie wynika na czym polega błąd.

Błąd polega na tym, że w klasie std::list żaden dostępny iterator nie umożliwia swobodnego dostępu do elementów (nie implementuje operacji przesunięcia wskaźnika o więcej niż jedną pozycję). Brak ten można wykryd następująco: template <class RandomAccessIterator> void stable_sort_constraints(randomaccessiterator i) { typename std::iterator_traits<randomaccessiterator>::difference_type n; i += n; Skompilowanie tego kodu wygeneruje czytelny komunikat o błędzie, informujący o braku możliwości wykonania danej operacji. Celem jest skompilowanie powyższego kodu lecz nie wykonywanie go, ponieważ zazwyczaj nie ma on sensu lub zabiera dużo czasu. Aby to osiągnąd deklarowany i definiowany jest wskaźnik do stworzonej funkcji, który jednak nigdzie nie jest wywoływany.

METAPROGRAMOWANIE Metaprogramowanie to w ogólności tworzenie programów, które modyfikują kod innych (lub swój własny) programów. W przypadku metaprogramowania przy pomocy szablonów C++ sprowadza się to do tworzenia kodu rozwiązującego problemy na etapie kompilacji. Standardowy przykład obliczanie silnii: template<int n> struct Silnia { enum { wynik = Silnia<n-1>::wynik * n //konkretyzacja dla warunku stopu, template<> struct Silnia<0> { enum { wynik = 1 Wywołanie: int x = Silnia<12>::val; Spowoduje obliczenie (w czasie kompilacji) wartości silnii z 12.

PĘTLE I INSTRUKCJE WARUNKOWE Każdą pętle można zapisd przy pomocy rekurencji, a zatem: template<int N, int P> struct Potega { enum { val = N*Potega<N, P-1>::val template<int N> struct Potega<N, 0> { enum { val = 1 Powyższy kod pozwala na obliczanie dodatnich potęg liczb całkowitych. Instrukcje warunkowe można tworzyd wykorzystująd trójargumentowy operator :? template<int n1, int n2> struct Max { enum { val = n1 > n2? n1 : n2

Powyższy przykład można zapisad bardziej ogólnie: template<bool condition> struct Select { template<> struct Select<true> { static int getfirst(int n1, int n2) { return n1; static int f(int n1, int n2) { return getfirst(n1, n2); template<> struct Select<false> { static int getsecond(int n1, int n2) { return n2; static int f(int n1, int n2) { return getsecond(n1, n2); template<bool condition> void maximum(int n1, int n2) { return Select<(n1 > n2)>::f(n1,n2); Użytecznośd tych metod jest jednak ograniczona. Ponieważ obliczenia wykonywane mają byd w czasie kompilacji, wykonywanie obliczeo na danych podanych przez użytkownika nie jest trywialne.

CIEKAWOSTKI Standard C++ 0x umożliwia stosowanie technik programistycznych dostępnych wcześniej wyłącznie dla klas i funkcji nieszablonowych dla szablonów. Są to m.in: Klasy lub funkcje szablonowe oznaczone jako extern Udostępniono słowo kluczowe analogiczne do typedef, using, działające dla nieukonkretnionych szablonów. Umożliwiono tworzenie szablonów o zmiennej liczbie parametrów: template<typename... Values> struct Tuple { /* */ Implementacja klasy Tuple (klasa przechowująca n wartości dowolncyh typów) bazuje na prywatnym dziedziczeniu rekurencyjnym: template<class First, typename... Rest> class Tuple : private Tuple<Rest> { private: First m_element;