C ++

Ako používať šablóny C ++

Ako používať šablóny C ++

Úvod

V základnom programovaní v C ++ je dátový typ, napr.g., int alebo char, musia byť uvedené vo vyhlásení alebo v definícii. Hodnota ako 4 alebo 22 alebo -5 je int. Hodnota ako „A“ alebo „b“ alebo „c“ je znak. Mechanizmus šablón umožňuje programátorovi použiť všeobecný typ pre množinu skutočných typov. Napríklad programátor sa môže rozhodnúť použiť identifikátor T pre int alebo char. Je možné, že algoritmus C ++ má viac ako jeden všeobecný typ. Povedzme, že T pre int alebo char, U môže znamenať plavák alebo ukazovateľ. Trieda, ako je napríklad reťazec alebo vektorová trieda, je ako dátový typ a instanceované objekty sú ako hodnoty dátového typu, čo je zadaná trieda. Mechanizmus šablón teda umožňuje programátorovi použiť aj generický identifikátor typu pre množinu tried.

Šablóna C ++ vytvára algoritmus nezávislý od typu použitých údajov. Rovnaký algoritmus s mnohými výskytmi rovnakého typu môže teda pri rôznych spusteniach používať rôzne typy. Entity premennej, funkcie, štruktúry a triedy môžu mať šablóny. Tento článok vysvetľuje, ako deklarovať šablóny, ako definovať šablóny a ako ich použiť v jazyku C++. Mali by ste už mať vedomosti o vyššie uvedených entitách, aby ste porozumeli témam, ktorým sa venuje tento článok.

Typy

Skalárne

Skalárne typy sú void, bool, char, int, float a pointer.

Triedy ako typy

Konkrétnu triedu možno považovať za typ a jeho objekty za možné hodnoty.

Všeobecný typ predstavuje množinu skalárnych typov. Zoznam skalárnych typov je rozsiahly. Napríklad typ int má ďalšie súvisiace typy, napríklad krátky int, dlhý int atď. Generický typ môže predstavovať aj množinu tried.

Variabilné

Príklad deklarácie a definície šablóny je nasledovný:

šablóna
T pi = 3.14;

Predtým, ako budete pokračovať, nezabudnite, že tento druh výpisu sa nemôže objaviť vo funkcii main () ani v nijakom rozsahu bloku. Prvý riadok je deklarácia hlavy šablóny s generickým názvom typu programu zvoleným programátorom T. Ďalším riadkom je definícia identifikátora pi, ktorý je generického typu T. Presnosť, či je T int, float alebo iný typ, je možné vykonať vo funkcii C ++ main () (alebo v inej funkcii). Takáto presnosť sa vykoná s premennou pi, a nie s T.

Prvý riadok je vyhlásenie šablóny. Toto vyhlásenie začína vyhradeným slovom, šablónou a potom zátvorkami v otvorenom a uzavretom uhle. V uhlových zátvorkách sa nachádza aspoň jeden všeobecný identifikátor typu, napríklad T, vyššie. Môže existovať viac ako jeden generický identifikátor typu, pričom každému musí predchádzať vyhradené slovo, typename. Takéto všeobecné typy na tejto pozícii sa nazývajú parametre šablóny.

Nasledujúci príkaz je možné napísať main () alebo akoukoľvek inou funkciou:

cout << pi << '\n';

A funkcia by zobrazila 3.14. Výraz pi rozhodne presný typ T pre premennú pi. O konkrétnom dátovom type parametra šablóny rozhoduje špecializácia. Vytvorenie inštancie je v tomto prípade interný proces C ++ vytvárania konkrétneho typu, napríklad float. Nezamieňajte medzi vytvorením inštancie parametra šablóny a vytvorením inštancie triedy. V téme šablóna môže mať veľa údajových typov jeden všeobecný názov typu, zatiaľ čo veľa tried môže mať jeden všeobecný názov triedy. Všeobecný názov triedy pre triedy sa však jednoducho označuje ako trieda, a nie ako názov triedy. Hodnota je tiež pre dátový typ, napríklad int, pretože inštančný objekt je pre triedu, ako je napríklad trieda String.

Pri špecializácii sa zvolený dátový typ, napríklad float, umiestňuje do lomených zátvoriek za premennou. Ak je v deklarácii hlavy šablóny viac ako jeden parameter šablóny, vo výraze špecializácie bude zodpovedajúci počet dátových typov v rovnakom poradí.

Pri špecializácii je typ známy ako argument šablóny. Nezamieňajte si to s argumentom funkcie pre volanie funkcie.

Predvolený typ

Ak pri špecializácii nie je uvedený žiadny typ, predpokladá sa predvolený typ. Takže z nasledujúceho výrazu:

šablóna
U pi = „láska“;
displej z:
cout << pi<> << '\n';

je „láska“ pre neustáleho ukazovateľa na char. Vo vyhlásení si všimnite, že U = const char *. Uhlové zátvorky budú pri špecializácii prázdne (žiadny typ nie je uvedený); skutočný typ sa považuje za konštantný ukazovateľ na char, predvolený typ. Ak by bol pri špecializácii potrebný iný typ, potom by sa názov typu zapísal do lomených zátvoriek. Ak je pri špecializácii požadovaný predvolený typ, opakovanie typu v lomených zátvorkách je voliteľné, t.e., uhlové zátvorky môžu zostať prázdne.

Poznámka: Predvolený typ je možné pri špecializácii zmeniť tým, že budete mať iný typ.

štruktúr

Nasledujúci príklad ukazuje, ako je možné použiť parameter šablóny so štruktúrou:

šablóna štruktúrne vekové skupiny

T John = 11;
T Peter = 12;
T Mary = 13;
T Joy = 14;
;

Jedná sa o vek študentov v ročníku (triede). Prvý riadok je vyhlásenie šablóny. Text v zátvorkách je skutočnou definíciou šablóny. Veky je možné zadať vo funkcii main () pomocou nasledujúcich položiek:

Veky stupeň7;
cout << grade7.John << " << grade7.Mary << '\n';

Výstup je: 11 13. Prvý výrok tu vykonáva špecializáciu. Všimnite si, ako to bolo vyrobené. Poskytuje tiež názov objektu struct: grade7. Druhý príkaz má bežné výrazy štruktúrovaných objektov. Štruktúra je ako trieda. Vek je tu ako názov triedy, zatiaľ čo stupeň 7 je objektom triedy (struct).

Ak sú niektoré vekové skupiny celé čísla a iné plaváky, potom štruktúra potrebuje dva všeobecné parametre:

šablóna štruktúrne vekové skupiny

T John = 11;
U Peter = 12.3;
T Mary = 13;
U Joy = 14.6;
;

Relevantný kód pre funkciu main () je nasledovný:

Veky stupeň7;
cout << grade7.John << " << grade7.Peter << '\n';

Výstup je: 11 12.3. Pri špecializácii musí poradie typov (argumentov) zodpovedať poradiu generických typov v deklarácii.

Deklaráciu šablóny je možné od definície oddeliť takto:

šablóna štruktúrne vekové skupiny

T John;
U Peter;
T Mary;
U Joy;
;
Veky stupeň7 = 11, 12.3, 13, 14.6;

Prvý segment kódu je čisto deklaráciou šablóny (neexistujú žiadne priradenia). Druhým segmentom kódu, ktorý je iba výrokom, je definícia identifikátora, stupeň7. Na ľavej strane je deklarácia identifikátora, stupeň 7. Na pravej strane je zoznam inicializátorov, ktorý priraďuje zodpovedajúce hodnoty členom štruktúry. Druhý segment (príkaz) je možné zapísať do funkcie main (), zatiaľ čo prvý segment zostáva mimo funkcie main ().

Non-Type

Medzi príklady nedátových typov patria typy int, ukazovateľ na objekt, ukazovateľ na funkciu a automatické typy. Existujú aj iné typy, ktoré tento článok nerieši. Netypický typ je ako neúplný typ, ktorého hodnota je uvedená neskôr a nemožno ho zmeniť. Ako parameter sa začína konkrétnym netypom, za ktorým nasleduje identifikátor. Hodnota identifikátora je uvedená neskôr, pri špecializácii, a nemožno ju znova zmeniť (ako konštanta, ktorej hodnota je uvedená neskôr). Nasledujúci program to ilustruje:

#include
pomocou namespace std;
šablóna štruktúrne vekové skupiny

T John = N;
U Peter = 12.3;
T Mary = N;
U Joy = 14.6;
;
int main ()

Veky stupeň7;
cout << grade7.John << " << grade7.Joy << '\n';
návrat 0;

Pri špecializácii je prvý typ, int, v lomených zátvorkách viac pre formálnosť, aby sa ubezpečil, že počet a poradie parametrov zodpovedá počtu a poradiu typov (argumentov). Hodnota N bola uvedená pri špecializácii. Výstup je: 11 14.6.

Čiastočná špecializácia

Predpokladajme, že šablóna má štyri generické typy a že spomedzi týchto štyroch typov sú potrebné dva predvolené typy. To sa dá dosiahnuť pomocou konštrukcie čiastočnej špecializácie, ktorá nepoužíva operátora priradenia. Konštrukt čiastočnej špecializácie teda dáva predvolené hodnoty podmnožine všeobecných typov. V schéme čiastočnej špecializácie je však potrebná základná trieda (struct) a trieda čiastočnej špecializácie (struct). Nasledujúci program to ilustruje pre jeden generický typ z dvoch generických typov:

#include
pomocou namespace std;
// základná trieda šablón
šablóna
štruktúrne vekové skupiny

;
// čiastočná špecializácia
šablóna
štruktúrne vekové skupiny

T1 John = 11;
plavák Peter = 12.3;
T1 Mária = 13;
plavák Joy = 14.6;
;
int main ()

Veky stupeň7;
cout << grade7.John << " << grade7.Joy << '\n';
návrat 0;

Identifikujte deklaráciu základnej triedy a jej čiastočnú definíciu triedy. Deklarácia hlavy šablóny základnej triedy má všetky potrebné všeobecné parametre. Deklarácia hlavy šablóny triedy čiastočnej špecializácie má iba všeobecný typ. V schéme sa nachádza ďalšia sada uhlových zátvoriek, ktorá nasleduje za názvom triedy v definícii čiastočnej špecializácie. To je to, čo v skutočnosti robí čiastočnú špecializáciu. Má predvolený typ a neštandardný typ v poradí napísanom v základnej triede. Upozorňujeme, že predvolenému typu môže byť vo funkcii main () stále priradený iný typ.

Relevantný kód vo funkcii main () môže byť nasledovný:

Veky stupeň7;
cout << grade7.John << " << grade7.Joy << '\n';

Výstup je: 11 14.6.

Sada parametrov šablón

Balík parametrov je parameter šablóny, ktorý prijíma nula alebo viac všeobecných typov šablón pre zodpovedajúce dátové typy. Parameter pack parameter začína vyhradeným slovom typename alebo class. Nasledujú tri bodky a potom identifikátor balíka. Nasledujúci program ilustruje, ako je možné použiť balík parametrov šablóny so štruktúrou:

#include
pomocou namespace std;
šablóna štruktúrne vekové skupiny

int John = 11;
plavák Peter = 12.3;
int Mary = 13;
plavák Joy = 14.6;
;
int main ()

Veky stupeň B;
cout << gradeB.John << " << gradeB.Mary << '\n';
Veky stupeň C;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Veky stupeňD;
cout << gradeD.John << " << gradeD.Joy << '\n';
Vek <> stupeň A; // ako predvolené
cout << gradeA.John << " << gradeA.Joy << '\n';
návrat 0;

Výstup je:

11 13
12.3 14.6
11 14.6
11 14.6

Šablóny funkcií

Vyššie uvedené funkcie šablón sa používajú podobným spôsobom ako šablóny funkcií. Nasledujúci program zobrazuje funkciu s dvoma všeobecnými parametrami šablóny a tromi argumentmi:

#include
pomocou namespace std;
šablóna void func (T no, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
návrat 0;

Výstup je nasledovný:

V obchode je 12 kníh v hodnote 500 dolárov.

Oddelenie od prototypu

Definíciu funkcie je možné oddeliť od prototypu, ako ukazuje nasledujúci program:

#include
pomocou namespace std;
šablóna void func (T no, U cha, const char * str);
šablóna void func (T no, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
návrat 0;

Poznámka: Deklarácia šablóny funkcie sa nemôže objaviť vo funkcii main () ani v iných funkciách.

Preťaženie

K preťaženiu tej istej funkcie môže dôjsť pomocou rôznych vyhlásení o hlave šablóny. Nasledujúci program to ilustruje:

#include
pomocou namespace std;
šablóna void func (T no, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

šablóna void func (T no, const char * str)

cout << "There are " << no << " books worth $" << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
func (12, "500");
návrat 0;

Výstup je:

V obchode je 12 kníh v hodnote 500 dolárov.

V obchode je 12 kníh v hodnote 500 dolárov.

Šablóny tried

Vlastnosti šablón uvedených vyššie sa používajú podobným spôsobom ako šablóny tried. Nasledujúcim programom je deklarácia, definícia a použitie jednoduchej triedy:

#include
pomocou namespace std;
trieda TheCla

verejné:
int num;
statický znak ch;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

static void fun (char ch)

if (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj;
obj.num = 12;
obj.func ('$', "500");
návrat 0;

Výstup je nasledovný:

V obchode je 12 kníh v hodnote 500 dolárov.

Nasledujúci program je vyššie uvedený program s vyhlásením šablóny:

#include
pomocou namespace std;
šablóna trieda TheCla

verejné:
T num;
statický U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

static void fun (U ch)

if (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj;
obj.num = 12;
obj.func ('$', "500");
návrat 0;

Namiesto slova typename v zozname parametrov šablón je možné použiť slovnú triedu. Všimnite si špecializáciu vo vyhlásení o objekte. Výstup je stále rovnaký:

V obchode je 12 kníh v hodnote 500 dolárov.

Separačné vyhlásenie

Deklaráciu šablóny triedy je možné oddeliť od kódu triedy takto:

šablóna trieda TheCla;
šablóna trieda TheCla

verejné:
T num;
statický U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

static void fun (U ch)

if (ch == 'a')
cout << "Official static member function" << '\n';

;

Zaobchádzanie so statickými členmi

Nasledujúci program ukazuje, ako získať prístup k statickým údajovým členom a funkciám statického člena:

#include
pomocou namespace std;
šablóna trieda TheCla

verejné:
T num;
statický U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statická prázdnota (U cha)

if (ch == 'a')
cout << "Official static member function" << cha << '\n';

;
šablóna U TheCla:: ch = 'a';
int main ()

TheCla:: zábava ('.');
návrat 0;

Priradenie hodnoty členu statických údajov je deklarácia a nemôže byť v main (). Všimnite si použitie a pozície generických typov a dátového generického typu v príkaze na priradenie. Ďalej si všimnite, že členská funkcia statických údajov bola volaná v main () so skutočnými dátovými typmi šablón. Výstup je nasledujúci:

Oficiálna statická členská funkcia.

Kompilácia

Vyhlásenie (hlavička) a definícia šablóny musia byť v jednom súbore. To znamená, že musia byť v tej istej prekladovej jednotke.

Záver

Vďaka šablónam C ++ je algoritmus nezávislý od typu použitých údajov. Entity premennej, funkcie, štruktúry a triedy môžu mať šablóny, ktoré zahŕňajú deklaráciu a definíciu. Vytvorenie šablóny tiež zahŕňa špecializáciu, čo je prípad, keď generický typ vezme skutočný typ. Vyhlásenie aj definícia šablóny musia byť v jednej prekladovej jednotke.

Ako zmeniť ľavé a pravé tlačidlo myši na počítači so systémom Windows 10
Je úplnou normou, že všetky zariadenia počítačových myší sú ergonomicky navrhnuté pre pravákov. Existujú však dostupné myšacie zariadenia, ktoré sú šp...
Napodobňovanie kliknutí myšou vznášaním sa pomocou myši bez myši vo Windows 10
Používanie myši alebo klávesnice v nesprávnom postoji k nadmernému používaniu môže mať za následok veľa zdravotných problémov vrátane napätia, syndróm...
Pridajte gestá myši do systému Windows 10 pomocou týchto bezplatných nástrojov
V posledných rokoch sa počítače a operačné systémy veľmi vyvinuli. Boli časy, keď používatelia museli prechádzať správcami súborov pomocou príkazov. R...