Ficsor Lajos Template-ek CPP8/ 1 Template-ek
Ficsor Lajos Template-ek CPP8/ 2 A template fogalma Kiindulási probléma: tetszőleges típusokon kellene ugyanolyan műveleteket definiálni. Például: lista adatszerkezet - a lista elemei bármilyen objektumok lehetnek, de a lista mint adatszerkezet kezelése az elemei típusától független! Eddigi megoldás: egy Lista bázisosztály, amiből a leszármazott osztályok öröklik az adatok kezelését. (Container osztályok)
Ficsor Lajos Template-ek CPP8/ 3 Megoldás: parametrizált osztály Típus mint paraméter. Hasonló feldolgozási mechanizmus, mint a makrók esetén - de a fordítóprogram dolga! Egyszerű parametrizált (generikus) osztály: template class Vektor { definíció, ahol a T bárhol szerepelhet típusnévként };
Ficsor Lajos Template-ek CPP8/ 4 Konkretizálás (használat) A parametrizált osztály neve, T helyett egy ismert típust írva, a programban bárhol típusnévként szerepelhet. Példák: Vektor EgeszVektor; Vektor tankor; Vektor * mutato = new Vektor [100];
Ficsor Lajos Template-ek CPP8/ 5 Feldolgozás A parametrizált osztály a fordítóprogram számára egy minta osztálydefiníciók készítésére. Minden egyes típushoz, amelyre az adott osztályt konkretizáljuk, készül egy valódi osztály-definíció, ahol a T helyett mindenütt az adott típus neve szerepel.
Ficsor Lajos Template-ek CPP8/ 6 Egyszerű példa: dinamikus tömb template class Vektor { int elemek_szama; T* elemek; public: Vektor(int hossz = 100); Vektor(const Vektor & masik); T& operator[] (int index); };
Ficsor Lajos Template-ek CPP8/ 7 Tagfüggvények implementációi template Vektor ::Vektor (int hossz = 100) {elemek_szama = hossz; elemek = new T[hossz];} template Vektor ::Vektor (const Vektor & masik) {...}
Ficsor Lajos Template-ek CPP8/ 8 template T& vektor ::operator[] (int index) {return elemek[index];} A teljes példa: CPPEX28
Ficsor Lajos Template-ek CPP8/ 9 Template argumentumok A template-ben vesszővel elválasztott argumentumlista is megadható. template A lista elemei class T (ahol T paraméter) típus azon[= default érték] ahol a default érték konstans kifejezés
Ficsor Lajos Template-ek CPP8/ 10 Példa template class Stack { T elemek[meret];... } Ezekután írható: Stack s1; Stack s11; Stack s2; Stack, 200> s3;
Ficsor Lajos Template-ek CPP8/ 11 Megjegyzések A template használata nem rövidíti a futtatható kódot, csak a forráskódot. A parametrizált osztály tervezése nem egyszerű, mert bármilyen paraméterekkel konkretizálható! Két aktualizált típus csak akkor egyező, ha minden argumentumukban egyeznek. Figyelem, értékes helyköz a > jelek között: Vektor >
Ficsor Lajos Template-ek CPP8/ 12 Függvény template Nem csak tagfüggvény visszatérési értéke vagy paramétere lehet template, hanem külső függvényé is. Például: template void csere(T& egyik, T& masik) {T tmp = egyik; egyik = masik; masik = tmp; }
Ficsor Lajos Template-ek CPP8/ 13 A fordítóprogram minden hívás hatására egy- egy függvénydefiníciót generál, ha még nem volt olyan. Példák: int a,b; … csere(a,b); Szemely en,te; … csere(en,te); csere(a,en); //HIBA!
Ficsor Lajos Template-ek CPP8/ 14 Megjegyzések: Több template-argumentumot használó függvény hívásai meglepően sok függvény- definíciót eredményezhetnek! Azonos névvel template nélküli definíció is megadható, ekkor a megfelelő típusokra az hívódik meg. Például a void csere(char*, char*); definiálható úgy, hogy ne a pointerek értéke, hanem a karaktertömbök cserélődjenek meg.