Jazyk C++ I. Šablony 3



Podobné dokumenty
Jazyk C++ I. Šablony 2

Jazyk C++ I. Šablony

Jazyk C++ I. Polymorfismus

Jazyk C++ II. Šablony a implementace

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

přetížení operátorů (o)

Programování v C++ 2, 4. cvičení

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

PREPROCESOR POKRAČOVÁNÍ

Prostory jmen. #include<iostream.h> namespace RadimuvProstor { int secti(int a, int b); class Trida { private: int Atribut; public: void metoda();

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

Jazyk C++ I. Polymorfismus

Mělká a hluboká kopie

Základní stavební prvky algoritmu

Jazyk C++ II. Výjimky

PB161 Programování v jazyce C++ Přednáška 10

Jazyk C++ II. Dynamické identifikace typů

PB161 Programování v jazyce C++ Přednáška 10

Jazyk C# přednáška 01. Fakulta elektrotechniky a informatiky Univerzita Pardubice 2014/2015

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

Cílem kapitoly je seznámit studenta se strukturou programu a jeho překladem.

Java a Caché IV: Manipulace s objekty

PŘETĚŽOVÁNÍ OPERÁTORŮ

TESTY - elektronické testování. studentu UPa. O destruktory mohou být statické. Návrat na portál Studenti Testy

Programování v C++ 3, 3. cvičení

PB161 Programování v jazyce C++ Objektově Orientované Programování

Obrázek. Základní popis, zadání úkolu. Struktura tříd,

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Úvod do programovacích jazyků (Java)

Operace nad celými tabulkami

Předmět: Ročník: Vytvořil: Datum: ŠČERBOVÁ M. PAVELKA V. NOSNÍKY NOSNÍKY

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Úvod Petr Kropík viz:

Informační a komunikační technologie. 1.4 Data, informace, komprimace

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Více o konstruktorech a destruktorech

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT. Cyklus while, do-while, dělitelnost, Euklidův algoritmus

Programování 1. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

PB přednáška (23. listopadu 2015)

Sada 2 - MS Office, Excel

5. Ř etězce (třída String)

Standardní algoritmy vyhledávací.

Generické programování

Programování v Javě I. Leden 2008

Programování v C++ 1, 6. cvičení

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

Teoretické minimum z PJV

účetních informací státu při přenosu účetního záznamu,

Programování v Javě I. Únor 2009

Konstruktory a destruktory

Zápis programu v jazyce C#

-1- N á v r h ČÁST PRVNÍ OBECNÁ USTANOVENÍ. 1 Předmět úpravy

Pokyny České pošty pro označování Doporučených zásilek čárovými kódy

Daniel Velek Optimalizace 2003/2004 IS1 KI/0033 LS PRAKTICKÝ PŘÍKLAD NA MINIMALIZACI NÁKLADŮ PŘI VÝROBĚ

3 Vývojová prostředí, základní prvky jazyka Java, konvence jazyka Java

Sestava, tiskárna, příslušenství, kompatibilita se skenerem

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Jazyk C# (seminář 6)

Programování v C++ 2, 8. cvičení

Přetěžování operátorů

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

přetížení operátorů (o)

NEJČASTĚJI KLADENÉ DOTAZY K PUBLICITĚ PROJEKTŮ OP LZZ

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Základní umělecká škola Sokolov, Staré náměstí 37, Sokolov

Aplikace počítačů v provozu vozidel 9

Analýzy v GIS. Co se nachází na tomto místě? Kde se nachází toto? Kolik tam toho je? Co se změnilo od? Co je příčinou? Co když?

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Standardní algoritmy v C++.

Příloha Průběžné zprávy. Shrnutí návrhu algoritmu

PC, POWER POINT, dataprojektor

Moderní technologie ve studiu aplikované fyziky CZ.1.07/2.2.00/ Reálná čísla

BRICSCAD V16. Modelování strojírenských sestav

Inovace profesního vzdělávání ve vazbě na potřeby Jihočeského regionu CZ.1.07/3.2.08/ Závěrečná práce

Faremní systémy podle zadání PS LFA s účastí nevládních organizací

Programování v C++ 1, 1. cvičení

EKONOMIKA Výrobní činitelé, práce, kapitál výkladový materiál

Tab. 1 Podíl emisí TZL a SO₂ v krajích z celkového objemu ČR v letech 2003 až 2009 (v %)

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

Typický prvek kolekce pro české řazení

Algoritmizace a programování

Sbírka úloh pro elektronickou stavebnici. Stručný popis programovacího jazyka Bascom AVR

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

Úvod do programování - Java. Cvičení č.4

Outlook manuál. BeeOnline. Rychlý kontakt:

(sponzorský vzkaz) Grafický manuál

KUPNÍSMLOUVA. Dodávka vrtacich souprav. uzavřená podle zákona č. 89/2012 Sb., občanského zákoníku, v platném znění mezi smluvními stranami

c sin Příklad 2 : v trojúhelníku ABC platí : a = 11,6 dm, c = 9 dm, α = Vypočtěte stranu b a zbývající úhly.

Příloha č. 54. Specifikace hromadné aktualizace SMS-KLAS

2.2.2 Zlomky I. Předpoklady:

Střední průmyslová škola strojnická Olomouc, tř. 17. listopadu 49. Výukový materiál zpracovaný v rámci projektu Výuka moderně

ROZDÍL SE SKRÝVÁ V DETAILECH

Zpracoval:

Metoda Lokální multiplikátor LM3. Lokální multiplikátor obecně. Ing. Stanislav Kutáček. červen 2010

itradebook addin Doplněk pro import dat z programu Ninja Trader

PB přednáška (26. října 2015)

Transkript:

Jazyk C++ I Šablony 3 AR 2013/2014 Jazyk C++ I

Třídy template <class T> class TVektor { T *a; int n; static int PocInstanci; public: TVektor(int _n = 0) : n(_n) { a = new T[n]; PocInstanci++; } ~TVektor() { delete[] a; PocInstanci--; } T& operator[](int index) { return a[index]; } bool operator == (const TVektor& t); static int GetPocInstanci() { return PocInstanci; } }; AR 2013/2014 Jazyk C++ I 2

Metody template<class T1, class T2, int z> struct TA { void f1(); void f2(); void f3(); void f4(); // }; AR 2013/2014 Jazyk C++ I 3

Metody template<class T1, class T2, int z> void TA<T1, T2, z>::f1() { } // ok template<class T2, class T1, int z> void TA<T2, T1, z>::f2() { } // ok template<class T1, class T2, int z> void TA<z, T2, T1>::f3() { } // error template<class T1, int z, class T2> void TA<T1, z, T2>::f4() { } // error AR 2013/2014 Jazyk C++ I 4

Metody template<class T> bool TVektor<T>::operator == (const TVektor& t) { if (n!= t.n) return false; for (int i = 0; i < n; i++) { if (a[i]!= t.a[i]) return false; } return true; } AR 2013/2014 Jazyk C++ I 5

Instance template <class T = int, int n = 10> class TA { }; TA<char, 12> B; // ok TA<char> A; // ok TA<char, 10> TA<> C; // ok TA<int, 10> TA D; // error AR 2013/2014 Jazyk C++ I 6

Vnořené šablony template <class T, class U> struct TA { template <class V> struct TB { V z; U z2; V Pricti(V x); }; }; T x, y; TB<U> b; AR 2013/2014 Jazyk C++ I 7

Vnořené šablony template <class T, class U> template <class V> V TA<T, U>::TB<V>::Pricti(V x) { z += x; return z; } AR 2013/2014 Jazyk C++ I 8

Vnořené šablony TA<int, double> A; A.x = 10; // x je typu int A.b.z = 5.4; // z je typu double //instance vnořené šablony TB //typ int v TA<int, double> nemá na deklaraci //TB vliv, může být libovolného typu TA<int, double>::tb<char> B; B.z = 'c'; B.z2 = 5.4; AR 2013/2014 Jazyk C++ I 9

Vnořené šablony template <class T> class TVektor { //... template <class InputIterator> void Assign(InputIterator first, InputIterator last); }; AR 2013/2014 Jazyk C++ I 10

Vnořené šablony template <class T> template <class InputIterator> void TVektor<T>::Assign(InputIterator first, InputIterator last) { //... } TVektor<int> A; int b[] = { 10, 20, 30, 40 }; A.Assign(b, b+3); AR 2013/2014 Jazyk C++ I 11

Vnořené šablony template <class T> class Tvektor { // template <class InputIterator> TVektor(InputIterator first, InputIterator last) : a(0) { Assign(first, last); PocInstanci++; } }; AR 2013/2014 Jazyk C++ I 12

Vnořený typ typového parametru šablony template<class T> class TA { typename T::TC b; //... }; AR 2013/2014 Jazyk C++ I 13

Vnořený typ typového parametru šablony template<class T> class TA { typedef typename T::TC TCC; TTC b; //... }; AR 2013/2014 Jazyk C++ I 14

Explicitní specializace obyčejná funkce template<class T> void Vypis(T t1, T t2) { cout << t1 << ", " << t2 << '\n'; } // explicitní specializace šablony funkce template<> void Vypis(double t1, double t2) { printf("%.1lf, %.1lf\n", t1, t2); } AR 2013/2014 Jazyk C++ I 15

Explicitní specializace obyčejné funkce Vypis(10, 12); // OK call primary template for create instance Vypis(10.0, 12.5); // OK call explicite specialization Vypis(10, 12.5); // Error AR 2013/2014 Jazyk C++ I 16

Explicitní specializace metody šablony třídy template <class T> class TVektor { void Vypis(); }; template <class T> void TVektor<T>::Vypis() { } //specialization template < > void TVektor<double>::Vypis() { for (int i = 0; i < n; i++) printf("%.1lf ", a[i]); cout << '\n'; }; AR 2013/2014 Jazyk C++ I 17

Explicitní specializace šablony třídy template<> class TVektor<char> { char* a; public: TVektor() { a = 0; } TVektor(const char* s); ~TVektor() { delete[] a; } // }; TVektor<char>::TVektor(const char* s) { a = new char[strlen(s)+1]; strcpy(a, s); } AR 2013/2014 Jazyk C++ I 18

Explicitní specializace vnořené šablony template <class T> struct TA { template <class U> struct TB { U z; }; T x; }; template <> template<> struct TA<int>::TB<int> { int z1, z2; }; TA<int>::TB<double> B; B.z = 2.3; TA<int>::TB<int> C; // instance of explicit specialization TB AR 2013/2014 Jazyk C++ I 19

Explicitní specializace vnořené šablony template <class T> template<> struct TA<T>::TB<char> { char z3; }; AR 2013/2014 Jazyk C++ I 20

Explicitní specializace vnořené šablony template <class T> struct TA { T x; template <class U> void f(u u) { x = T(u); } }; template <> template <> void TA<char>::f(const char* c) { x = c[0]; } TA<int> A; A.f(10.5); // call primary nested template TA<char> B, C; B.f('A'); // call primary nested template C.f("text"); // call explicit specialized nested template, C.x = 't' AR 2013/2014 Jazyk C++ I 21

Parciální specializace šablon Poskytuje alternativní definici k primární definici šablony pro určité druhy parametrů. AR 2013/2014 Jazyk C++ I 22

Parciální specializace šablon Primární šablona musí mít alespoň informativní deklaraci před deklaracemi parciálních specializací této šablony. Každá parciální specializace šablony představuje odlišnou šablonu musí být kompletně definovaná. Může obsahovat jiné složky, než které obsahuje primární šablona. AR 2013/2014 Jazyk C++ I 23

Parciální specializace šablon Parciálně specializované deklarace se od primární deklarace liší Za jménem šablony následují v lomených závorkách formální parametry, které určují způsob specializace. Parametry mohou mít odlišné názvy než formální parametry primární šablony AR 2013/2014 Jazyk C++ I 24

Parciální specializace šablon template<class T, class U, int n> class TA { }; //#1 template<class T, int n> class TA<T, T*, n> { }; //#2 template<class T, class U, int n> class TA<T*, U, n> { }; //#3 template<class V> class TA<int, V*, 5> { }; //#4 template<class T, class U, int n> class TA<T, U*, n> { }; //#5 AR 2013/2014 Jazyk C++ I 25

Parciální specializace šablon template<class T, class U, int n> class TA { }; template<class T, int n> class TA<T, T*, n> { }; template<class T, class U, int n> class TA<T*, U, n> { }; template<class V> class TA<int, V*, 5> { }; template<class T, class U, int n> class TA<T, U*, n> { }; TA<int, int, 1> a1;??? AR 2013/2014 Jazyk C++ I 26

Parciální specializace šablon template<class T, class U, int n> class TA { }; template<class T, int n> class TA<T, T*, n> { }; template<class T, class U, int n> class TA<T*, U, n> { }; template<class V> class TA<int, V*, 5> { }; template<class T, class U, int n> class TA<T, U*, n> { }; TA<int, int*, 1> a2;??? AR 2013/2014 Jazyk C++ I 27

Parciální specializace šablon template<class T, class U, int n> class TA { }; template<class T, int n> class TA<T, T*, n> { }; template<class T, class U, int n> class TA<T*, U, n> { }; template<class V> class TA<int, V*, 5> { }; template<class T, class U, int n> class TA<T, U*, n> { }; TA<int, char*, 1> a4;??? AR 2013/2014 Jazyk C++ I 28

Parciální specializace šablon template<class T, class U, int n> class TA { }; template<class T, int n> class TA<T, T*, n> { }; template<class T, class U, int n> class TA<T*, U, n> { }; template<class V> class TA<int, V*, 5> { }; template<class T, class U, int n> class TA<T, U*, n> { }; TA<int, char*, 5> a3;??? AR 2013/2014 Jazyk C++ I 29

Parciální specializace šablon template<class T, class U, int n> class TA { }; template<class T, int n> class TA<T, T*, n> { }; template<class T, class U, int n> class TA<T*, U, n> { }; template<class V> class TA<int, V*, 5> { }; template<class T, class U, int n> class TA<T, U*, n> { }; TA<int*, int*, 2> a5;??? AR 2013/2014 Jazyk C++ I 30

Parciální specializace šablony Složky jako metody, statické atributy, vnořené třídy a šablony definované mimo tělo šablony, musí obsahovat stejný seznam formálních parametrů Stejný seznam specializovaných parametrů jako parciálně specializovaná šablona. AR 2013/2014 Jazyk C++ I 31

Parciální specializace šablony template <class T, int i> struct TA { void f(); }; template <class T, int i> void TA<T, i>::f(){... } template <class T> struct TA<T, 2> { void f(); }; template <class T> void TA<T, 2>::f() {... } AR 2013/2014 Jazyk C++ I 32

Parciální specializace šablony Explicitní specializace složky parciálně specializované šablony třídy se deklarují stejným způsobem jako explicitní specializace složky primární šablony třídy. AR 2013/2014 Jazyk C++ I 33

Parciální specializace šablony template <class T, int i> struct TA { void f(); }; template <class T, int i> void TA<T, i>::f(){... } template <class T> struct TA<T, 2> { void f(); }; template <class T> void TA<T, 2>::f() {... } template <> void TA<char, 2>::f() {... } AR 2013/2014 Jazyk C++ I 34

Parciální specializace šablony void g() { TA<char, 1> a1; TA<int, 2> a2; TA<char, 2> a3; a1.f(); a2.f(); a3.f(); } AR 2013/2014 Jazyk C++ I 35

Parciální specializace šablony template <class T, int n> class TKonstVektor { T a[n]; public: TKonstVektor(const T& t = T()) { for (int i = 0; i < n; i++) a[i] = t; } T& operator[](int i) { return a[i]; } }; AR 2013/2014 Jazyk C++ I 36

Parciální specializace šablony template <class T, int n> class TKonstVektor<T*, n> { T* a[n]; public: TKonstVektor(const T& t = T()) { for (int i = 0; i < n; i++) a[i] = new T(t); } T& operator[](int i) { return *a[i]; } }; AR 2013/2014 Jazyk C++ I 37

Parciální specializace šablony template <class T> class TKonstVektor<T*, 2> { T* a[2]; public: TKonstVektor(const T& t = T()) { a[0] = new T(t); a[1] = new T(t); } T& operator[](int i) { return *a[i]; } }; AR 2013/2014 Jazyk C++ I 38

Parciální specializace šablony TKonstVektor<int, 10> A(0); TKonstVektor<long*, 10> B(1); TKonstVektor<double*, 2> C; AR 2013/2014 Jazyk C++ I 39

Explicitní vytvoření instance Překladači můžeme přikázat, aby vytvořil instanci šablony, aniž by se hned použila. Lze provést pro šablony funkcí, tříd, metod a statických atributů. AR 2013/2014 Jazyk C++ I 40

Explicitní vytvoření instance Pro explicitně vytvořené instance šablony třídy překladač ihned vytvoří všechny její metody, statické atributy, a to i když nejsou v programu použity. Stanou se součástí souboru *.obj a *.exe. U dalších typů šablon je to obdobné. AR 2013/2014 Jazyk C++ I 41

Explicitní vytvoření instance Syntakticky korektní zápis explicitního vytvoření instance šablony je: template declaration Za deklaraci se uvádí v lomených závorkách skutečné parametry šablony. Výjimkou jsou šablony funkce, u kterých překladač umí odvodit koncové parametry. AR 2013/2014 Jazyk C++ I 42

Explicitní vytvoření instance Explicitní vytvoření instance šablony Tvektor pro typ int. template class TVektor<int>; Nevytváří se ale instance vnořených šablon (tříd a metod). Nevytvoří se tedy instance metod! AR 2013/2014 Jazyk C++ I 43

Explicitní vytvoření instance Potřeba vytvoření explicitních instancí metod template void TVektor<int>::assign<int*>(int*, int*); template TVektor<int>::TVektor(int*, int*); AR 2013/2014 Jazyk C++ I 44

Explicitní vytvoření instance Explicitně lze vytvořit i instance jednotlivých metod a statických atributů bez nutnosti tvořit explicitně instanci celé třídy. template int TVektor<double>::PocInstanci; AR 2013/2014 Jazyk C++ I 45

Přátelé Přítelem třídy nebo šablony třídy může být: Obyčejná funkce, Jiná třída, Šablona obyčejné funkce, Šablona jiné třídy, Specializace šablony jiné třídy, Specializace šablony jiné třídy. AR 2013/2014 Jazyk C++ I 46

Přátelé Pokud má být přítelem šablony třídy TA obyčejná funkce, tak zpravidla jeden z jejích argumentů je typu reference nebo ukazatel na šablonu třídy TA. V takovém případě se jedná o šablonu obyčejné funkce, která má jako formální šablonové parametry formální parametry šablony třídy TA. AR 2013/2014 Jazyk C++ I 47

Přátelé template <class T> class TA; template <class T> void f2(ta<t>&); template <class T> class TB; template <class T> class TA { friend void f1(ta<int>&); friend void f2<t>(ta<t>&); template <class T, class U> friend void f3(ta<t>&, U); friend class TB<long>; template <class U> friend class TC; T x; public: TA(T _x) : x(_x) {} }; AR 2013/2014 Jazyk C++ I 48

Přátelé void f1(ta<int&> A) { A.x = A.x; } template<class T> void f2(ta<t>& A) { A.x += 2; } template<class T, class U> void f3(ta<t>& A, U u) { A.x += static_cast<t>(u); } TA<int> A1(2); TA<float> A2(10.5); f1(a); //OK f1(a2); //ERROR AR 2013/2014 Jazyk C++ I 49

Přátelé template<class T> void f2(ta<t>& A) { A.x += 2; } Obyčejná funkce f2 včetně jejich explicitních specializaci je přítelem šablony třídy TA. Takto uvedená deklarace spřátelené šablony funkce vyžaduje deklaraci prototypu šablony funkce f2 před definicí šablony třídy TA. Protože v tomto prototypu je uvedena šablona TA<T>, musí být před ním uvedena informativní deklarace šablony třídy TA. Šablona funkce f2 má jeden formální šablonový parametr T, který je identický s formálním parametrem T šablony třídy TA. Přítelem instance typu TA<int> je instance šablony funkce f2, která má tvar: void f2<int>(ta<int>&); f2(a); // A.x = 4 f2(a2); // A2.x = 7 AR 2013/2014 Jazyk C++ I 50

Přátelé Šablonu funkce f2 lze jako přítele šablony třídy TA deklarovat pomocí následujícího způsobu: template <class T> class TA { template <class T> friend void f2(ta<t>&); //... }; Zde není potřeba informativní deklarace šablony funkce f2 před definicí šablony třídy TA. AR 2013/2014 Jazyk C++ I 51

Přátelé template<class T, class U> void f3(ta<t>& A, U u) { A.x += static_cast<t>(u); } Šablona funkce f3 je přítelem šablony třídy TA, mající dva typové parametry T a U. Parametr T je identický s formální parametrem T šablony třídy TA. Mohl by mít i jiné označení. AR 2013/2014 Jazyk C++ I 52

Přátelé template <class T> class TB { T y; public: TB(T _y) : y(_y) {} template <class U> void g(ta<u>& A) { y += A.x; } }; Přítelem šablony třídy TA je také specializace šablony třídy TB pro typ long. Metodu g lze tedy volat pouze pro instanci typu TB<long>. TB<long> B1(3); TB<float> B2(3.5); B1.g(A); // OK B2.g(A); // Error AR 2013/2014 Jazyk C++ I 53

Přátelé Přítelem šablony třídy TA je také libovolná instance šablony třídy TC. template <class T> class TC { T z; public: TC(T _z) : z(_z) {} template <class U> void h(ta<u>& A) { z += A.x; } }; Metodu h lze tedy volat pouze pro libovolnou instanci TC. TC<double> C(3.2); C.h(A); // OK AR 2013/2014 Jazyk C++ I 54

Zdroje PRATA, Stephen. Mistrovství v C++. 3. aktualiz. vyd. Překlad Boris Sokol. Brno: Computer Press, 2007, 1119 s. ISBN 978-80-251-1749-1. cplusplus.com AR 2013/2014 Jazyk C++ I 55