templates c with examples
Naučte sa rôzne aspekty šablón v C ++.
Šablóny sú jednou z najsilnejších funkcií v C ++. Šablóny nám poskytujú kód, ktorý je nezávislý od dátového typu.
Inými slovami, pomocou šablón môžeme napísať všeobecný kód, ktorý funguje na akomkoľvek dátovom type. Potrebujeme iba odovzdať dátový typ ako parameter. Tento parameter, ktorý odovzdáva dátový typ, sa tiež nazýva názov typu.
V tomto výučbe podrobne preskúmame všetky šablóny a ich rôzne aspekty.
=> Kliknutím sem zobrazíte sériu školení Absolute C ++.
Čo sa dozviete:
- Čo sú šablóny?
- Ako používať šablóny / implementáciu?
- typové meno vs. kľúčové slovo triedy
- Vytvorenie šablóny a špecializácia
- Špecializácia šablón
- C ++ Variadic šablóny
- Záver
- Odporúčané čítanie
Čo sú šablóny?
Ako už bolo spomenuté vyššie, šablóny sú všeobecné, t. J. Nezávislé od dátového typu. Šablóny sa používajú hlavne na zabezpečenie opätovnej použiteľnosti kódu a flexibility programov. Môžeme len vytvoriť jednoduchú funkciu alebo triedu, ktorá berie dátový typ ako parameter, a implementovať kód, ktorý funguje pre akýkoľvek dátový typ.
Napríklad, Ak chceme, aby algoritmus triedenia fungoval pre všetky číselné dátové typy aj pre znakové reťazce, napíšeme iba funkciu, ktorá berie dátový typ ako argument, a implementujeme techniku triedenia.
Potom v závislosti od dátového typu (názov typu), ktorý sa odovzdáva do algoritmu triedenia, môžeme nechať dáta triediť bez ohľadu na typ údajov. Takto nemusíme písať desať algoritmov pre desať dátových typov.
Takto môžu byť šablóny použité v aplikáciách, kde požadujeme, aby bol kód použiteľný pre viac ako jeden dátový typ. Šablóny sa používajú aj v aplikáciách, kde má prvoradý význam opätovné použitie kódu.
Ako používať šablóny / implementáciu?
Šablóny je možné implementovať dvoma spôsobmi:
- Ako funkčná šablóna
- Ako šablóna triedy
Šablóna funkcie
Šablóna funkcie je ako normálna funkcia, ale jediný rozdiel je, keď normálna funkcia môže fungovať iba na jednom dátovom type a kód šablóny funkcie môže fungovať na viacerých dátových typoch.
Aj keď môžeme skutočne preťažiť normálnu funkciu tak, aby fungovala na rôznych dátových typoch, šablóny funkcií sú vždy užitočnejšie, pretože musíme napísať jediný program a ten môže fungovať na všetkých dátových typoch.
Ďalej sa dočkáme implementácie funkčných šablón.
Všeobecná syntax šablóny funkcie je:
template T function_name(T args){ …… //function body }
Tu je T argument šablóny, ktorý akceptuje rôzne dátové typy a trieda je kľúčové slovo. Namiesto triedy kľúčových slov môžeme napísať aj „typename“.
Keď sa konkrétny údajový typ odovzdá funkčnému názvu, kópiu tejto funkcie vytvorí kompilátor s týmto údajovým typom ako argumentom a funkciou.
Pozrime sa na príklad na lepšie pochopenie funkčných šablón.
#include using namespace std; template void func_swap(T &arg1, T &arg2) { T temp; temp = arg1; arg1 = arg2; arg2 = temp; } int main() { int num1 = 10, num2 = 20; double d1 = 100.53, d2 = 435.54; char ch1 = 'A', ch2 = 'Z'; cout << 'Original data
'; cout << 'num1 = ' << num1 << ' num2 = ' << num2<Šablóny tried Rovnako ako v šablónach funkcií môžeme mať požiadavku, aby sme mali triedu podobnú všetkým ostatným aspektom, ale iba rôzne typy údajov.
V tejto situácii môžeme mať v jednej triede rôzne triedy pre rôzne dátové typy alebo inú implementáciu pre rôzne dátové typy. Ak to však urobíte, náš kód bude objemný.
Najlepšie urobíte, ak použijete triedu šablón. Trieda šablón sa tiež chová podobne ako šablóny funkcií. Pri vytváraní objektov alebo volaní členských funkcií musíme triede odovzdať dátový typ ako parameter.
Všeobecná syntax pre šablónu triedy je:
template class className{ ….. public: T memVar; T memFunction(T args); };
Vo vyššie uvedenej definícii T slúži ako zástupný symbol pre dátový typ. Verejní členovia memVar a memFunction tiež používajú T ako zástupný symbol pre dátové typy.
Keď už je trieda šablón definovaná vyššie, môžeme objekty triedy vytvárať nasledovne:
className classObejct1; className classObject2; className classObject3;
Implementujme príklad kódu na demonštráciu šablón tried:
#include using namespace std; template class myclass { T a, b; public: myclass (T first, T second) {a=first; b=second;} T getMaxval (); }; template T myclass::getMaxval () { return (a>b? a : b); } int main () { myclass myobject (100, 75); cout<<'Maximum of 100 and 75 = '< Výkon:
Maximálne 100 a 75 = 100
Maximálne „A“ a „a“ = a
Vyššie uvedený program implementuje príklad šablóny triedy. Máme triedu šablón myclass. V tomto vnútri máme konštruktor, ktorý inicializuje dva členy a a b triedy. Existuje ďalšia členská funkcia getMaxval, ktorá je tiež šablónou funkcie, ktorá vracia maximálne a a b.
V hlavnej funkcii zostrojíme dva objekty, myobjekt typu integer a mychobject typu charakter. Potom na každý z týchto objektov zavoláme funkciu getMaxval, aby sme určili maximálnu hodnotu.
Upozorňujeme, že okrem parametrov typu šablóny (parametre typu T) môžu mať funkcie šablóny aj bežné parametre, ako sú bežné funkcie, a tiež predvolené hodnoty parametrov.
typové meno vs. kľúčové slovo triedy
Pri deklarovaní triedy alebo funkcie šablóny používame jedno z dvoch kľúčových slov class alebo typename. Tieto dve slová sú sémanticky rovnocenné a dajú sa zameniť.
Ale v niektorých prípadoch nemôžeme tieto slová použiť ako rovnocenné. Napríklad, keď používame závislé dátové typy v šablónach ako „typedef“, použijeme namiesto triedy typename.
Kľúčové slovo triedy sa musí použiť, aj keď musíme šablónu explicitne vytvoriť inštanciu.
Vytvorenie šablóny a špecializácia
Šablóny sú písané všeobecne, čo znamená, že ide o všeobecnú implementáciu bez ohľadu na typ údajov. Podľa poskytnutého dátového typu musíme pre každý dátový typ vygenerovať konkrétnu triedu.
Napríklad, ak máme algoritmus triedenia šablón, môžeme vygenerovať konkrétnu triedu na triedenie, inú triedu na triedenie atď. Toto sa nazýva inštancia šablóny.
Parametre šablóny v definícii triedy šablón nahradíme argumentmi šablóny (skutočné dátové typy).
Napríklad,
template class sort {};
Keď odovzdáme dátový typ, kompilátor nahradí dátový typ „T“, takže sa algoritmus triedenia zmení na sort.
Zakaždým, keď používame triedu alebo funkciu šablóny, existuje potreba inštancie, keď odovzdáme konkrétny dátový typ. Ak táto inštancia ešte nie je k dispozícii, kompilátor ju vytvorí s konkrétnym dátovým typom. Toto je implicitná inštancia.
Jednou z nevýhod implicitnej inštancie je, že kompilátor generuje inštančnú triedu iba pre argumenty, ktoré sa v súčasnosti používajú. To znamená, že ak chceme vygenerovať knižnicu inštancií pred použitím týchto inštancií, musíme ísť na explicitné vytvorenie inštancie.
Nižšie je uvedený príklad vyhlásenia o šablóne:
template class Array(T)
Môže byť explicitne vyjadrený ako:
template class Array
Keď sa vytvorí inštancia triedy, vytvoria sa inštancie aj všetci jej členovia.
Špecializácia šablón
Pri programovaní pomocou šablón by sme sa mohli ocitnúť v situácii, že by sme mohli vyžadovať špeciálnu implementáciu pre konkrétny dátový typ. Keď nastane takáto situácia, ideme na špecializáciu šablón.
V špecializácii šablón implementujeme špeciálne správanie pre konkrétny dátový typ okrem pôvodnej definície šablóny pre ostatné dátové typy.
rozdiel medzi stratégiou testu a plánom testu
Napríklad, zvážime, že máme triedu šablón ‘ myIncrement ‘ ktorý má konštruktor na inicializáciu hodnoty a funkciu šablóny naInkrement čím sa hodnota zvýši o 1.
Táto konkrétna trieda bude perfektne fungovať pre všetky dátové typy okrem char. Prečo nezvýšiť hodnotu znaku char, tak prečo to neurobiť zvláštnym správaním a namiesto toho konvertovať znak na veľké písmená?
Aby sme to dosiahli, môžeme prejsť na špecializáciu šablón pre dátový typ char.
Táto implementácia je uvedená v príklade kódu nižšie.
#include using namespace std; // class template: template class myIncrement { T value; public: myIncrement (T arg) {value=arg;} T toIncrement () {return ++value;} }; // class template specialization: template class myIncrement { char value; public: myIncrement (char arg) {value=arg;} char uppercase () { if ((value>='a')&&(value<='z')) value+='A'-'a'; return value; } }; int main () { myIncrement myint (7); myIncrement mychar ('s'); myIncrement mydouble(11.0); cout<<'Incremented int value: '<< myint.toIncrement()<< endl; cout<<'Uppercase value: '< Výkon:
Zvýšená int hodnota: 8
Hodnota veľkého písmena: S
Zvýšená dvojnásobná hodnota: 12

Vo vyššie uvedenom programe, ktorý demonštruje špecializáciu šablón, uvidíte spôsob, akým sme deklarovali špecializovanú šablónu pre typ char. Najprv deklarujeme pôvodnú triedu a potom ju „špecializujeme“ na typ char. Na začatie špecializácie používame prázdne vyhlásenie šablóny „template“.
Potom za názov triedy zahrnieme dátový typ. Po týchto dvoch zmenách je trieda napísaná pre typ char.
V hlavnej funkcii nezabudnite, že nie je rozdiel medzi inštanciami typu char a inými typmi. Jediný rozdiel je v tom, že predefinujeme špecializovanú triedu.
Upozorňujeme, že musíme definovať všetkých členov špecializovanej triedy, aj keď sú v triede generických / pôvodných šablón úplne rovnakí. Je to preto, že pre členov nemáme funkciu dedenia od generickej šablóny po špecializovanú šablónu.
C ++ Variadic šablóny
Doteraz sme videli funkčné šablóny, ktoré zaberajú pevný počet argumentov. Existujú aj šablóny, ktoré zaberajú premenlivý počet argumentov. Tieto funkčné šablóny sa nazývajú variadické šablóny. Variadic šablóny sú jednou z najnovších funkcií jazyka C ++ 11.
Variadic šablóny berú premenlivý počet argumentov, ktoré sú bezpečné pre typ a argumenty sú vyriešené v čase kompilácie.
Aby sme tomu porozumeli, vezmime si kompletný programovací príklad.
#include #include using namespace std; template T summation(T val) { return val; } template T summation(T first, Args... args) { return first + summation(args...); } int main() { long sum = summation(1, 2, 3, 8, 7); cout<<'Sum of long numbers = '< Vyššie uvedený príklad demonštruje variadickú funkciu „súčet“. Ako je uvedené vyššie, najskôr potrebujeme základnú funkciu, ktorá implementuje základný prípad. Potom implementujeme variadickú funkciu navrch tejto funkcie.
V súhrne premennej funkcie sa volá „typename ... args“ balík šablón parametrov keďže sa volá „Args… args“ balík funkčných parametrov .
Po napísaní šablóny funkcie, ktorá implementuje základný prípad, napíšeme variadickú funkciu, ktorá implementuje všeobecný prípad. Variadická funkcia je napísaná podobne ako rekurzia, ktorá je znázornená pri sčítaní (args ...). Prvý argument je oddelený od balíka parametrov funkcií do typu T (prvý).
S každou výzvou na súčet sa zoznam parametrov zúži o jeden argument a nakoniec sa dosiahne základná podmienka. Výstup zobrazuje súčet dlhých celých čísel a znakov.
Záver
Týmto uzatvárame tento tutoriál o šablónach v C ++. Šablóny nám pomáhajú robiť naše programy všeobecné, t. J. Nezávislé od typu.
Prečítajte si tiež = >> Výukový program pre šablónu banky
Všeobecné programy vždy stoja nad ostatnými programami, pretože pre každý typ údajov nemusíme písať samostatné programy. Vývoj všeobecných programov bezpečných pre typ môže byť teda dôležitým krokom k efektívnemu programovaniu.
=> Tu si pozrite podrobné výukové návody C ++.
Odporúčané čítanie
- Výukový program pre hlavné funkcie Pythonu s praktickými príkladmi
- Ako funguje testovanie na základe dát (príklady QTP a selénu)
- Multithreading v C ++ s príkladmi
- Výukový program pre Python DateTime s príkladmi
- Ukážka šablóny testovacieho prípadu s príkladmi testovacích prípadov (Stiahnuť)
- Vystrihnite príkaz v systéme Unix s príkladmi
- Vzorová šablóna pre správu o prevzatí s príkladmi
- Syntax príkazov Unix Cat, možnosti s príkladmi