Jazyk C++ II. Šablony a implementace



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

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

Jazyk C++ I. Šablony

Jazyk C++ II. Výjimky

Jazyk C++ I. Šablony 3

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

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

Jazyk C++ I. Polymorfismus

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

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

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

Jazyk C++ I. Polymorfismus

Mělká a hluboká kopie

PROGRAMOVÁNÍ V C++ CVIČENÍ

PREPROCESOR POKRAČOVÁNÍ

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

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

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

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

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

Úvod do programovacích jazyků (Java)

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

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

Zpracoval:

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

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

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

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

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

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

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

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

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

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

Jazyk C++ II. STL knihovna kontejnery část 2

Více o konstruktorech a destruktorech

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

1. Programování proti rozhraní

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

Dědění, polymorfismus

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

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

map, multimap - Asociativní pole v C++.

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Konstruktory a destruktory

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.

1. Dědičnost a polymorfismus

Objekty a třídy. Procedurální a objektově orientované programování. V této kapitole se naučíte: Procedurální a objektově orientované programování

Jazyk C++ II. Dynamické identifikace typů

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

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

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

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

GENERICKÉ PROGRAMOVÁNÍ: CÍLE A MOŽNOSTI IMPLEMENTACE

Abstraktní třídy, polymorfní struktury

Funkční objekty v C++.

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í

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

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

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

Generické programování

Výčtový typ strana 67

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

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

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

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

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

IRAE 07/08 Přednáška č. 1

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

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

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

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 programovacích jazyků (Java)

Abstraktní datové typy

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

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

Odvozené a strukturované typy dat

Pole a kolekce. v C#, Javě a C++

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

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

Vector datový kontejner v C++.

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

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

Základy programování (IZP)

Standardní algoritmy vyhledávací.

2 Datové typy v jazyce C

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

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

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

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

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

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Teoretické minimum z PJV

Základy objektové orientace I. Únor 2010

Sada 1 - Základy programování

Jazyk C# (seminář 6)

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

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

Transkript:

Jazyk C++ II Šablony a implementace AR 2013/2014 Jazyk C++ II

Úvod Dědičnost a kompozice nejsou vždy tou správnou odpovědí na požadavky znovupoužitelnosti kódu. Proto máme možnost definování určité třídy n (například zásobníku) obecným způsobem a potom dodat určitý typ jako parametr třídy. Obecný způsob nezávisle na typu dat. AR 2013/2014 Jazyk C++ II 2

Šablony Šablony nabízejí parametrizované typy, tedy možnost předat název typu jako parametr pro vytvoření třídy nebo funkce. Knihovna STL nabízí výkonné a pružné implementace šablon několika kontejnerových tříd. AR 2013/2014 Jazyk C++ II 3

Šablony Na šablony se můžeme koukat jako na lepší makra. O makra se stará preprocesor a o šablony překladač. Za běhu programu už žádné šablony neexistují. Existují pouze jejich instance datové typy, metody, statické datové složky nebo volné funkce, které překladač podle šablon vytvoří. AR 2013/2014 Jazyk C++ II 4

Šablony tříd Každou šablonu předchází následující kód: template <class Type> template <typename Type> Klíčovým slovem template říkáme překladači, že budeme definovat šablonu. Část v lomených závorkách je podobná seznamu parametrů funkce. Klíčové slovo class (typename) můžeme zaměnit za název typu proměnné. Slovo type je název proměnné. AR 2013/2014 Jazyk C++ II 5

Šablony tříd template <class Type> Název obecného typu v místě Type si můžeme zvolit. Pravidla pro názvy jsou stejné jako pro ostatní identifikátory. Při vyvolání šablony bude Type nahrazen konkrétní hodnotou typu. AR 2013/2014 Jazyk C++ II 6

Šablony tříd template <class Type> class TridaA { Type hodnota; public: Trida(Type & hodnota); } AR 2013/2014 Jazyk C++ II 7

Šablony tříd Trida<int> trida(5); class TridaA { int hodnota; public: Trida(int hodnota); } AR 2013/2014 Jazyk C++ II 8

Šablony tříd template <class TypeKey, class TypeValue> class Par { TypeKey key; TypeValue value; public: Par(TypeKey key, TypeValue value); TypeKey & getkey() { return key; }; TypeValue & getvalue() { return value; }; bool operator==(const Par<TypeKey, TypeValue> &secondpar); bool operator!=(const Par<TypeKey, TypeValue> &secondpar); ~Par(void); }; AR 2013/2014 Jazyk C++ II 9

Univerzálnosti šablon Šablony tříd můžeme používat stejně jako běžné třídy. Šablony mohou sloužit jako základní třídy. template <class Type> class TridaB : public TridaA<Type> Mohou být komponentami jiných tříd. template <class Type> class TridaC { TridaA<Type> objekt; } Mohou být typem parametru pro jiné šablony. TridaD <TridaA<int> > objekt; Mohou být přetěžovány jinými šablonami volných funkcí se stejném jmnénem nebo volnými funkcemi se stejným jménem. AR 2013/2014 Jazyk C++ II 10

Univerzálnosti šablon Rekurzivní použití Dříve definovanou šablonu můžeme použít pro pole. Array<Array<int, 20>, 10> > pole2d; V syntaxi šablon jsou rozměry uvedeny v opačném pořadí než v běžném dvourozměrném poli. AR 2013/2014 Jazyk C++ II 11

Univerzálnosti šablon Šablony s několika typy parametrů Šablona může mít i více než jeden typ parametru. template <class TypeKey, class TypeValue> class Pair { public: TypeKey key; TypeValue value; Pair(TypeKey &, TypeValue &); } AR 2013/2014 Jazyk C++ II 12

Univerzálnosti šablon Implicitní typové parametry šablon template <class T1, class T2 = int> class TridaA { }; Je-li T2 vynechán, použije překladač typ int. //T1 je double, T2 je double TridaA<double, double> m1; //T1 je double, T2 je int TridaA<double> m2; Jeden parametr lze použít jako implicitní hodnotu dalšího. template <typename T1, typename T2 = T1> class TridaA {... }; AR 2013/2014 Jazyk C++ II 13

Specializace šablon Šablonám tříd můžeme podobně jako šablonám funkcí vytvořit implicitní instance, explicitní vytvoření instance a explicitní specializaci. Souhrnně se to nazývá specializace. Šablona popisuje třídu podle obecného typu, kdežto specializace je deklarace třídy vygenerovaná pomocí konkrétního typu. AR 2013/2014 Jazyk C++ II 14

Specializace šablon Implicitní instance Překladač vygeneruje specializovanou definici třídy podle receptu daného obecnou šablonou. Provádí se při deklarování jednoho nebo více objektů požadovaného typu. Array<int, 100> pole; //implicitní instance Překladač vygeneruje implicitní instanci až tehdy, když potřebuje daný objekt: Array<int, 100> *pt; //ukazatel, objekt zatím není potřeba Pt = new Array<int, 100>; //nyní je objekt potřeba Překladač vygeneruje definici třídy a objekt, který je vytvořen v souladu s touto definici, až v případě druhého příkazu. AR 2013/2014 Jazyk C++ II 15

Specializace šablon Implicitní instance Šablona nenahrazuje prototyp. Jestliže si překladač implicitně vytvoří instanci šablony funkce, neznamená to, že zná prototyp funkce. Šablona, ani implicitně vytvořená instance neumožňuje např. implicitní konverze parametrů. template <typename T> T Max(T a, T b) { return a > b? a : b; } int a = 5, b = 8; char c = c, d = d ; a = Max(c, d); //vytvoří se instance pro typ char b = Max(a, c); //chyba nelze odvodit typ parametrů AR 2013/2014 Jazyk C++ II 16

Specializace šablon Explicitní specializace Definice určitých typů, které mají být použity místo obecné šablony. Pro potřeby upravení šablony, aby se chovala při vytvoření instance určitého typu jinak. Pokud je překladač postaven před volbou mezi specializovanou šablonou a šablonou obecnou, použije specializovanou verzi. Template <> class classname <název-spec-typu> { }; AR 2013/2014 Jazyk C++ II 17

Specializace šablon Explicitní specializace Šablona Array je specializovaná pro typ char * template <> class Array< char *> { }; //použití obecné definice Array<int> poleint; //použití specializované definice Array<char *> polecharp; AR 2013/2014 Jazyk C++ II 18

Specializace šablon Explicitní specializace Parametry, které si překladač dokáže odvodit, lze u šablon funkcí vynechat. template int Max<int>(int, int); Můžeme psát jako: template int Max(int, int); AR 2013/2014 Jazyk C++ II 19

Specializace šablon Částečné specializace Částečně omezují obecnou šablonu. Můžeme dodat např. určitý typ pro jeden z typových parametrů. //obecná šablona template <class T1, class T2> class Pair {...}; //specializovaná s T2 nastaveným na int template <class T1> class Pair<T1, int> {... }; AR 2013/2014 Jazyk C++ II 20

Specializace šablon Částečné specializace Pomocí dodání speciální verze můžeme specializovat šablonu na ukazatele. //obecná šablona template <class T1, class T2, class T3> class Trio { }; //specializace s T3 nastaveným na T2 template <class T1, class T2> class Trio <T1, T2, T2> { }; //specializace T3 a T2 nastaveným na T1* template <class T1> class Trio<T1, T1*, T1*> { }; AR 2013/2014 Jazyk C++ II 21

Specializace šablon Při uvedených deklaracích by překladač měl na vybranou : //použití obecné šablony Trio<int, short, char *> t1; //použití Trio<T1,T2,T2> Trio<int, short> t2; //použití Trio<T1, T1*, T1*> Trio<char, char *, char *> t3; AR 2013/2014 Jazyk C++ II 22

Členské šablony Šablona může být členem struktury, třídy nebo šablonové třídy. template <typename T> class TridaA { private: Template <typename V> //vnořený člen šablonové třídy Class TridaB {... }; TridaA<T> a1; //objekt šablony TridaA<T> a2; //objekt šablony public: TridaA(T a1, T a2) : a1(pom1), a1(pom2) {} Template<typename U> //metoda šablony T blab(t u, T t) { return (n.value() + q.value()) * u / t; } }; int main(int argc, char **argv) { Trida<double> objekt(3.5, 3); std::cout << objekt.blab(10, 2.3) << std::endl; } AR 2013/2014 Jazyk C++ II 23

Šablony jako parametry Šablona kromě typových parametrů (typename T) a netypových parametrů ( int ) může mít parametry, které jsou šablonami. template <template <typename T> class TridaB> class TridaA { TridaB<int> s1; TridaB<int> s2; public: TridaA(); {}; void Vypis() { cout << s1.vypis() << endl << s2.vypis(); } }; AR 2013/2014 Jazyk C++ II 24

Šablonové třídy a přátelé Deklarace šablonových tříd mohou mít přátelé. Můžeme je rozdělit do tří kategorií: Nešablonoví přátelé, Vázaní šablonoví přátele, Nevázaní šablonoví přátelé. AR 2013/2014 Jazyk C++ II 25

Nešablonové přátelské funkce šablonových tříd Deklarují se běžnou funkcí v šablonové třídě: template <class T> class HasFriend { //přítel všech instancí třídy HasFriend friend void counts(); }; Tato deklarace vytváří z funkce counts() přítele všech možných instancí šablony (Např.: HasFriend<int>, HasFriend<double> atd.). AR 2013/2014 Jazyk C++ II 26

Vázané šablonové přátelské funkce šablonových tříd Typ přítele, který je určen typem třídy, je-li třída konkretizována. Přátelské funkce jsou samy sobě šablonami. Lze provést takové nastavení, že svážeme šablonové přátele tak, aby každá specializace třídy k sobě měla specializaci přítele. Tři kroky pro vytvoření vázané šablonové přátelské funkce šablonové třídy: 1. Deklarace všech šablonových funkcí před definicí třídy. 2. Deklarujeme šablonu jako přítele uvnitř funkce. 3. Definujeme všechny šablonové funkce. AR 2013/2014 Jazyk C++ II 27

Vázané šablonové přátelské funkce šablonových tříd template <typename T> void counts(); template <typename T> void report(t &); tempate <typename V> class HasFriend {... friend void counts<v>(); frined void report<>(hasfrined<v> &); }; Funkce <> v deklaraci se identifikuje jako specializace šablon. V případě report() může funkce <> zůstat prázdná, protože argument typu šablona HasFriend<V> může být přejat z argumentu funkce. Můžeme ale místo toho použít Report<HasFriend<V> >(HasFrinedT<V> &) AR 2013/2014 Jazyk C++ II 28

Nevázané šablonové přátelské funkce šablonových tříd Všechny specializace přítele jsou přátelé všech specializací třídy. Vytváří se pomocí deklarace šablony uvnitř třídy. Pro tuto funkci je každá specializace funkce přítelem všech specializací tříd. Pro nevázané přátelé se typové parametry přátelské šablony od typových parametrů šablonové třídy liší. AR 2013/2014 Jazyk C++ II 29

Nevázané šablonové přátelské funkce šablonových tříd Tato funkce má přístup k členským položkám všech specializací. Využívá ale konkrétní přístup pouze k objektům ManyFriend<Typ> (např.: ManyFriend<int>). template <typename T> class ManyFriend {... template <class C, class D> friend void show(c &, D &); }; AR 2013/2014 Jazyk C++ II 30

Literatura PRATA, Stephen. Mistrovství v C++. 3. aktualiz. vyd. Překlad Boris Sokol. Brno: Computer Press, 2007, 1119 s. ISBN 978-80-251-1749-1. VIRIUS, Miroslav. 1001 tipů a triků pro C. Vyd. 1. Brno: Computer Press, 2011, 451, xx s. ISBN 978-80-251-2941-8. AR 2013/2014 Jazyk C++ II 31