Ú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ónaT 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 << piA funkcia by zobrazila 3.14. Výraz pi
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ónaU 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ónaT 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:
Vekycout << 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ónaT John = 11;
U Peter = 12.3;
T Mary = 13;
U Joy = 14.6;
;
Relevantný kód pre funkciu main () je nasledovný:
Vekycout << 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ónaT John;
U Peter;
T Mary;
U Joy;
;
Veky
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:
#includepomocou namespace std;
šablóna
T John = N;
U Peter = 12.3;
T Mary = N;
U Joy = 14.6;
;
int main ()
Veky
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:
#includepomocou 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
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ý:
Vekycout << 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:
#includepomocou namespace std;
šablóna
int John = 11;
plavák Peter = 12.3;
int Mary = 13;
plavák Joy = 14.6;
;
int main ()
Veky
cout << gradeB.John << " << gradeB.Mary << '\n';
Veky
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Veky
cout << gradeD.John << " << gradeD.Joy << '\n';
Vek <> stupeň A; // ako predvolené
cout << gradeA.John << " << gradeA.Joy << '\n';
návrat 0;
Výstup je:
11 1312.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:
#includepomocou namespace std;
šablóna
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:
#includepomocou namespace std;
šablóna
šablóna
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:
#includepomocou namespace std;
šablóna
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
šablóna
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:
#includepomocou 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:
#includepomocou namespace std;
šablóna
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.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šablóna
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:
#includepomocou namespace std;
šablóna
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
int main ()
TheCla
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.