Jazyk C++ I. Šablony 2



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

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

Jazyk C++ I. Polymorfismus

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

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

PREPROCESOR POKRAČOVÁNÍ

Mělká a hluboká kopie

Generické programování

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

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

Více o konstruktorech a destruktorech

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

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

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.

Konstruktory a destruktory

Úvod do programovacích jazyků (Java)

Zpracoval:

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

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

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).

Funkční objekty v C++.

Jazyk C++, některá rozšíření oproti C

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

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

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

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

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

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

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

Standardní algoritmy vyhledávací.

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

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

Virtuální metody - polymorfizmus

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

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

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

Jazyk C++ II. Výjimky

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Jazyk C# (seminář 6)

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Ukazka knihy z internetoveho knihkupectvi

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

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

Dědění, polymorfismus

Objektově orientované programování. Úvod

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

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

Singleton obsah. n Motivace. n Základní myšlenka. n Implementace. n Problémy. n Dědičnost. n Obecná implementace. n Shrnutí.

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

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

Seminář Java II p.1/43

Singleton obsah. Motivace Základní myšlenka Implementace Problémy. Dědičnost Obecná implementace Shrnutí. destrukce vícevláknovost

konstruktory a destruktory (o)

Chování konstruktorů a destruktorů při dědění

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

24. listopadu 2013, Brno Připravil: David Procházka

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

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

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

8 Třídy, objekty, metody, předávání argumentů metod

Dynamická identifikace typů v C++.

Jazyk C++ II. Dynamické identifikace typů

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

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Množina v C++ (set, multiset).

Abstraktní třídy, polymorfní struktury

Zápis programu v jazyce C#

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

1. Programování proti rozhraní

Základy C++ I. Jan Hnilica Počítačové modelování 18

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0;

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

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

Úvod do programovacích jazyků (Java)

Programování v jazyce C a C++

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).

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

Abstraktní datové typy

C++ objektově orientovaná nadstavba programovacího jazyka C

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Základy objektové orientace I. Únor 2010

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

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

Šablony funkcí a tříd (Templates) Genericita

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Mnohotvarost (polymorfizmus)

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1

Programování II. Návrh programu I 2018/19

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Transkript:

Jazyk C++ I Šablony 2 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 Složka třídy nebo šablony třídy Vnořená šablonová třída Vnořená šablonová metoda AR 2013/2014 Jazyk C++ I 7

Vnořené šablony Nemůžou být virtuální metody a destruktory Může jim být konstruktor V případě konstruktoru s jedním parametrem překladač nevytváří kopírovací konstruktor. Název šablony se může shodovat s názvem obyčejné metody. AR 2013/2014 Jazyk C++ I 8

Vnořené šablony Šablona metody se použije v případě, že si neodpovídají typy nebo počty formálních a skutečných parametrů. Vnořené šablony nemohou být součástí lokální třídy. Ve vnořené šabloně lze použít formální parametr šablony obklopující třídy, ale ne naopak. AR 2013/2014 Jazyk C++ I 9

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 10

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 11

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 12

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

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 14

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 15

Vnořený typ typového parametru šablony Typovým parametrem šablony může být třída obsahující deklaraci vnořeného typu. Lze použít v šabloně třídy Překladat kontroluje existenci vnořeného typu už v době, kdy narazí na deklaraci šablony. Potřeba překladači sdělit pomocí klíčového slova typename, že je to typ. AR 2013/2014 Jazyk C++ I 16

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

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 18

Funkce Pomocí šablon funkce můžeme popsat naráz celou řadu funkcí lišící se například pouze typem parametrů. AR 2013/2014 Jazyk C++ I 19

Funkce template<class T> inline T Max(T a, T b) { return a > b? a : b; } AR 2013/2014 Jazyk C++ I 20

Instance funkcí Pokud se zavolá funkce, kterou překladač nezná, ale je schopen ji vytvořit ze šablony, vytvoří se její potřebná instance. cout << Max(1, 2); // create Max<int> cout << Max(1.4, 1.5); // create Max<double> cout << Max(1, 'b'); // Error cout << Max(2.2, 1); // Error AR 2013/2014 Jazyk C++ I 21

Instance funkcí Můžeme také explicitně překladači říci, jaký typ má být použit. // bude se volat Max<int> cout << Max<int>(1, 'b'); // bude se volat //Max<double> cout << Max<double>(2.2, 1); AR 2013/2014 Jazyk C++ I 22

Instance funkcí Pokud je skutečný typ uveden jen jako návratový typ, překladač nedokáže v tomto případě vytvořit potřebnou instanci automaticky. template <class T> T f(int i) { return T(i*2); } double b = f(10); // Error double b = f<double>(10); // OK AR 2013/2014 Jazyk C++ I 23

Přetěžování V jednom oboru viditelnosti lze deklaravoat více šablon funkcí se stejným názvem. Stejně lze definovat šablonu funkce a obyčejnou funkci se stejným názvem. Pravidla pro určení, která varianta se bude volat se řídí podobnými pravidly jako u přetěžování obyčejných funkcí. AR 2013/2014 Jazyk C++ I 24

Přetěžování Pokud má překladač na vybranou, zda zavolat existující obyčejnou funkci nebo vytvořit instanci šablony funkce, Upřednostní obyčejnou funkci. Pokud typy formálních parametrů přesně odpovídají typům skutečných parametrů. Pokud si typy přesně neodpovídají, ale lze je implicitně konvertovat, dá překladač taktéž přednost obyčejné funkci. AR 2013/2014 Jazyk C++ I 25

Vazba jmen V těle šablony můžeme používat také globální jména typů, proměnných atd., Která jsou v místě deklarace šablony viditelná. AR 2013/2014 Jazyk C++ I 26

Vazba jmen int i = 10; template<class T> inline T GetI() { return i; } int main() { int i = 50; cout << GetI<int>(); } return 0; AR 2013/2014 Jazyk C++ I 27

Explicitní specializace Pokud je potřeba pro určité skutečné parametry deklarovat speciální verzi šablony, umožňuje to tzv. explicitní specializace. AR 2013/2014 Jazyk C++ I 28

Explicitní specializace Explicitní specializace lze deklarovat pro: Šablonu obyčejné funkce Šablonu třídy Metody šablonovy třídy Statický atribut šablony třídy Třídu vnořenou do šablony třídy Šablonu vnořenou do jiné šablony třídy Šablonu metody vnořenou do šablony třídy AR 2013/2014 Jazyk C++ I 29

Explicitní specializace Syntakticky korektní zápis explicitní specializace šablony: template <> declaration AR 2013/2014 Jazyk C++ I 30

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 31

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 32

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 33

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 34

Explicitní specializace vnořené šablony Musí být uvedeno mimo tělo obklopující šablony třídy. Pokud je pro obklopující šablonu třídy definována explicitní specializace, nemusí již být definována pro vnořenou šablonu. AR 2013/2014 Jazyk C++ I 35

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 36

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

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 38

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 39