C ++ šablóny

V tomto článku sa dozviete o šablónach v C ++. Naučíte sa využívať silu šablón na všeobecné programovanie.

Šablóny sú výkonné funkcie jazyka C ++, ktoré vám umožňujú písať všeobecné programy. Jednoducho povedané, pomocou šablón môžete vytvoriť jednu funkciu alebo triedu na prácu s rôznymi typmi údajov.

Šablóny sa často používajú vo väčšej základni kódov na účely opätovného použitia kódu a flexibility programov.

Koncept šablón je možné použiť dvoma rôznymi spôsobmi:

  • Šablóny funkcií
  • Šablóny tried

Šablóny funkcií

Šablóna funkcie funguje podobne ako normálna funkcia, s jedným kľúčovým rozdielom.

Jedna šablóna funkcie môže pracovať s rôznymi dátovými typmi naraz, ale jedna normálna funkcia môže fungovať iba s jednou množinou dátových typov.

Normálne, ak potrebujete vykonať totožné operácie na dvoch alebo viacerých druhoch údajov, pomocou preťaženia funkcií vytvoríte dve funkcie s požadovanou deklaráciou funkcie.

Lepším prístupom by však bolo použitie šablón funkcií, pretože tú istú úlohu môžete vykonať tak, že budete písať menej a udržiavateľný kód.

Ako deklarovať funkčnú šablónu?

Šablóna funkcie začína kľúčovým slovom template, za ktorým nasleduje parameter / parametre šablóny, za ktorým nasleduje vyhlásenie funkcie.

 šablóna < trieda T> T someFunction (T arg) (…)

Vo vyššie uvedenom kóde je T argument šablóny, ktorý akceptuje rôzne dátové typy (int, float) a class je kľúčové slovo.

Vo typenamevyššie uvedenom príklade môžete tiež použiť kľúčové slovo namiesto triedy.

Keď sa predá argument údajového typu someFunction( ), kompilátor vygeneruje novú verziu someFunction()pre daný údajový typ.

Príklad 1: Šablóna funkcie na vyhľadanie najväčšieho počtu

Program na zobrazenie najväčšieho z dvoch čísel pomocou šablón funkcií.

 // If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )

Výkon

Zadajte dve celé čísla: 5 10 10 je väčšie. Zadajte dve čísla s pohyblivou rádovou čiarkou: 12,4 10,2 12,4 je väčšia. Zadajte dva znaky: z Z z má väčšiu hodnotu ASCII.

Vo vyššie uvedenom programe Large()je definovaná funkčná šablóna, ktorá prijíma dva argumenty n1 a n2 údajového typu T. Tznamená, že argument môže mať akýkoľvek dátový typ.

Large() funkcia vráti najväčší z dvoch argumentov pomocou jednoduchej podmienenej operácie.

Vnútri main()funkcie, premenné troch rôznych typov dát: int, floata charsú deklarované. Premenné sa potom odovzdajú do Large()šablóny funkcie ako normálne funkcie.

Počas behu, keď je celé číslo odovzdané funkcii šablóny, kompilátor vie, že musí vygenerovať Large()funkciu na prijatie argumentov int, a robí tak.

Podobne, keď sa odovzdávajú údaje s pohyblivou rádovou čiarkou a údaje char, pozná dátové typy argumentov a podľa toho generuje Large()funkciu.

Týmto spôsobom nahradenie troch rovnakých bežných funkcií pomocou jedinej šablóny funkcie umožnilo udržanie vášho kódu.

Príklad 2: Zamieňajte údaje pomocou šablón funkcií

Programujte výmenu údajov pomocou šablón funkcií.

 #include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; ) 

Výkon

Pred odovzdaním údajov do šablóny funkcie. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Po odovzdaní údajov do šablóny funkcie. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

V tomto programe sa namiesto volania funkcie odovzdaním hodnoty vydá volanie odkazom.

Swap()Šablóna funkcie má dva argumenty a swap je podľa odkazu.

Šablóny tried

Rovnako ako šablóny funkcií, môžete tiež vytvoriť šablóny tried pre všeobecné operácie s triedami.

Niekedy potrebujete implementáciu triedy, ktorá je rovnaká pre všetky triedy, odlišné sú iba použité typy údajov.

Normálne by ste pre každý údajový typ museli vytvoriť inú triedu ALEBO vytvoriť rôzne členské premenné a funkcie v rámci jednej triedy.

To zbytočne nafúkne vašu kódovú základňu a bude ťažké ju udržiavať, pretože zmena predstavuje jednu triedu / funkciu, ktorá by sa mala vykonávať vo všetkých triedach / funkciách.

Šablóny tried však uľahčujú opätovné použitie rovnakého kódu pre všetky typy údajov.

Ako deklarovať šablónu triedy?

 template < class T> class className (… public: T var; T someOperation (T arg); …);

Vo vyššie uvedenej deklarácii Tje argument šablóny, ktorý je zástupným znakom použitého dátového typu.

V tele triedy sú členská premenná var aj členská funkcia someOperation()typu T.

Ako vytvoriť objekt šablóny triedy?

Ak chcete vytvoriť objekt šablóny triedy, musíte pri vytváraní definovať dátový typ vo vnútri a .

 className classObject; 

Napríklad:

className classObject; className classObject; className classObject;

Príklad 3: Jednoduchá kalkulačka s použitím šablóny triedy

Pomocou šablóny triedy naprogramujte sčítanie, odčítanie, násobenie a delenie dvoch čísel

 #include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; ) 

Výkon

Int. Výsledky: Čísla sú: 2 a 1. Sčítanie: 3 Odčítanie je: 1 Produkt je: 2 Rozdelenie je: 2 Float výsledky: Čísla sú: 2,4 a 1,2. Sčítanie je: 3,6 Odčítanie je: 1,2 Produkt je: 2,88 Divízia je: 2

Vo vyššie uvedenom programe Calculatorje deklarovaná šablóna triedy .

Trieda obsahuje dvoch súkromných členov typu T: num1 a num2 a konštruktor na inicializáciu členov.

Obsahuje tiež verejné členské funkcie na výpočet sčítania, odčítania, násobenia a delenia čísel, ktoré vracajú hodnotu dátového typu definovanú používateľom. Rovnako tak funkcia displayResult()na zobrazenie konečného výstupu na obrazovku.

Vo main()funkcii, dva rôzne Calculatorobjekty intCalca floatCalcsú vytvorené pre dátové typy: inta float, resp. Hodnoty sa inicializujú pomocou konštruktora.

Všimnite si, že pri vytváraní objektov používame a . Tieto informujú kompilátor o dátovom type použitom na vytvorenie triedy.

Takto sa vytvorí definícia triedy pre každú pre inta float, ktoré sa potom použijú zodpovedajúcim spôsobom.

Potom displayResult()sa zavolá obidva objekty, ktoré vykonajú operácie kalkulačky a zobrazia výstup.

Zaujímavé články...