C ++

Kaip naudoti C ++ šablonus

Kaip naudoti C ++ šablonus

Įvadas

Vykdant pagrindinį C ++ programavimą, duomenų tipas, el.g., int arba char, turi būti nurodyti deklaracijoje arba apibrėžime. Tokia vertė kaip 4 arba 22 arba -5 yra int. Tokia vertė kaip „A“, „b“ ar „c“ yra simbolis. Šablono mechanizmas leidžia programuotojui naudoti bendrąjį tipą faktinių tipų rinkiniui. Pavyzdžiui, programuotojas gali nuspręsti naudoti identifikatorių T int arba char. C ++ algoritmas gali turėti daugiau nei vieną bendrą tipą. Sakydami, kad T yra int arba char, U gali reikšti plūduriuojančio arba rodyklinio tipo. Klasė, pvz., Eilutė arba vektorinė klasė, yra panaši į duomenų tipą, o išjudinti objektai yra kaip duomenų tipo reikšmės, tai yra nurodyta klasė. Taigi šablonų mechanizmas taip pat leidžia programuotojui klasėms naudoti bendrąjį tipo identifikatorių.

C ++ šablonas sukuria algoritmą, nepriklausantį nuo naudojamų duomenų tipo. Taigi tas pats algoritmas su daugybe to paties tipo įvykių gali naudoti skirtingus tipus vykdant skirtingas vykdymo operacijas. Kintamojo, funkcijos, struktūros ir klasės esybės gali turėti šablonus. Šiame straipsnyje paaiškinta, kaip deklaruoti šablonus, kaip apibrėžti šablonus ir kaip juos naudoti C++. Jūs jau turėtumėte žinoti apie minėtus subjektus, kad suprastumėte šiame straipsnyje aptariamas temas.

Tipai

Skalaras

Skaliariniai tipai yra tuštuma, bool, char, int, float ir pointer.

Klasės kaip tipai

Konkrečią klasę galima laikyti tipu, o jos objektus - kaip galimas vertes.

Bendrasis tipas reiškia skaliarinių tipų rinkinį. Skaliarinių tipų sąrašas yra platus. Pavyzdžiui, int tipas turi kitų susijusių tipų, tokių kaip trumpasis int, ilgasis int ir kt. Bendrasis tipas taip pat gali atstovauti klasių rinkinį.

Kintamasis

Deklaracijos šablono ir apibrėžimo pavyzdys yra toks:

šabloną
T pi = 3.14;

Prieš tęsdami, atkreipkite dėmesį, kad tokio tipo teiginiai negali būti rodomi pagrindinėje () funkcijoje ar bet kurioje bloko srityje. Pirmoji eilutė yra šablono-galvos deklaracija su programuotojo pasirinktu bendru tipo pavadinimu T. Kita eilutė yra identifikatoriaus pi apibrėžimas, kuris yra bendro tipo T. Tikslumas, nesvarbu, ar T yra int, ar plūdė, ar kitas tipas, gali būti atliekamas naudojant funkciją C ++ main () (ar kurią nors kitą funkciją). Toks tikslumas bus atliekamas su kintamuoju pi, o ne su T.

Pirmoji eilutė yra šablono-galvos deklaracija. Ši deklaracija prasideda rezervuotu žodžiu, šablonu, o tada - atviro ir uždaro kampo skliaustais. Kampų skliaustuose aukščiau yra bent vienas bendro tipo identifikatorius, pvz., T. Gali būti daugiau nei vienas bendrojo tipo identifikatorius, prieš kiekvieną nurodant rezervuotą žodį, typename. Tokie bendrieji tipai toje padėtyje vadinami šablonų parametrais.

Šis sakinys gali būti parašytas main () arba bet kurioje kitoje funkcijoje:

cout << pi << '\n';

Ir funkcija rodys 3.14. Posakis pi nusprendžia tikslų kintamojo pi tipą T. Specializacija nusprendžia konkretų šablono parametro duomenų tipą. Instantiacija yra C ++ vidinis procesas kuriant konkretų tipą, pvz., „Float“, šiuo atveju. Nesupainiokite tarp šablono parametro ir klasės egzemplioriaus. Šablono temoje daugelis duomenų tipų gali turėti vieną bendrąjį tipo pavadinimą, o daugelis klasių gali turėti vieną bendrąjį klasės pavadinimą. Tačiau bendras klasių klasės pavadinimas paprasčiausiai vadinamas klase, o ne kaip klasės pavadinimu. Be to, reikšmė yra duomenų tipui, pvz., Int, kaip pavyzdinis objektas yra klasei, pvz., Eilutės klasei.

Specializuojantis, pasirinktas duomenų tipas, pvz., Plūduriuojantis, dedamas kampiniuose skliaustuose po kintamuoju. Jei šablono-galvos deklaracijoje yra daugiau nei vienas šablono parametras, specializacijos išraiškoje bus atitinkamas skaičius duomenų tipų ta pačia tvarka.

Specializuojantis tipas yra žinomas kaip šablono argumentas. Negalima painioti tarp to ir funkcijos argumento funkcijos iškvietimo.

Numatytasis tipas

Jei specializacijos metu nenurodomas joks tipas, laikomas numatytasis tipas. Taigi, iš šios išraiškos:

šabloną
U pi = "meilė";
ekranas iš:
cout << pi<> << '\n';

yra „meilė“ nuolatiniam rodikliui į char. Deklaracijoje atkreipkite dėmesį, kad U = const char *. Specializuojant kampiniai skliaustai bus tušti (tipas nenurodytas); tikrasis tipas yra laikomas konstatuojančiuoju char, numatytasis tipas. Jei specializuojant reikėjo kokio nors kito tipo, tipo pavadinimas bus įrašytas kampiniuose skliaustuose. Kai specializacijos metu pageidaujama numatytojo tipo, tipo pakartojimas kampiniuose skliaustuose yra neprivalomas, t.e., kampinius skliaustus galima palikti tuščius.

Pastaba: numatytąjį tipą vis tiek galima pakeisti specializuojant, turint kitą tipą.

struktūros

Šiame pavyzdyje parodyta, kaip šablono parametrą galima naudoti su „Struct“:

šabloną struktūros amžiai

T Jonas = 11;
T Petras = 12;
T Marija = 13;
T džiaugsmas = 14;
;

Tai yra klasės (klasės) mokinių amžius. Pirmoji eilutė yra deklaracijos šablonas. Kūnas breketais yra tikrasis šablono apibrėžimas. Amžius galima pateikti pagrindinėje () funkcijoje:

Amžius klasė7;
cout << grade7.John << " << grade7.Mary << '\n';

Išvestis yra: 11 13. Pirmasis teiginys atlieka specializaciją. Atkreipkite dėmesį, kaip jis buvo pagamintas. Tai taip pat suteikia struktūros objekto pavadinimą: grade7. Antrasis teiginys turi įprastas struktūros objekto išraiškas. Struktūra yra kaip klasė. Čia „Ages“ yra tarsi klasės pavadinimas, o „7“ yra klasės objektas (struct).

Jei kai kurie amžiai yra sveiki skaičiai, o kiti yra plūduriuojantys, struktūrai reikia dviejų bendrų parametrų:

šabloną struktūros amžiai

T Jonas = 11;
U Petras = 12.3;
T Marija = 13;
U džiaugsmas = 14.6;
;

Atitinkamas pagrindinis () funkcijos kodas yra toks:

Amžius klasė7;
cout << grade7.John << " << grade7.Peter << '\n';

Išvestis yra: 11 12.3. Specializuojantis tipų (argumentų) eiliškumas turi atitikti bendrųjų tipų tvarką deklaracijoje.

Deklaracijos šabloną galima atskirti nuo apibrėžimo taip:

šabloną struktūros amžiai

T Jonas;
U Petras;
T Marija;
U džiaugsmas;
;
Amžius 7 laipsnis = 11, 12.3, 13, 14.6;

Pirmasis kodo segmentas yra grynai šablono deklaracija (nėra priskyrimų). Antrasis kodo segmentas, kuris yra tik teiginys, yra identifikatoriaus, laipsnio7, apibrėžimas. Kairėje pusėje yra identifikatoriaus, 7 laipsnio, deklaracija. Dešinėje pusėje yra inicialų sąrašas, kuris priskiria atitinkamas vertes struktūros nariams. Antrasis segmentas (teiginys) gali būti parašytas pagrindinėje () funkcijoje, o pirmasis segmentas lieka už pagrindinės () funkcijos ribų.

Ne tipas

Ne duomenų tipų pavyzdžiai yra int, rodyklė į objektą, rodyklė į funkciją ir automatiniai tipai. Yra ir kitų tipų, kurių šis straipsnis nenagrinėja. Netipas yra kaip neišsamus tipas, kurio vertė pateikiama vėliau ir negali būti pakeista. Kaip parametras, jis prasideda nuo tam tikro tipo, po kurio nurodomas identifikatorius. Identifikatoriaus vertė pateikiama vėliau, specializuojantis, ir jos negalima pakeisti (kaip konstanta, kurios vertė pateikiama vėliau). Tai iliustruoja ši programa:

# įtraukti
naudojant vardų sritį std;
šabloną struktūros amžiai

T Jonas = N;
U Petras = 12.3;
T Marija = N;
U džiaugsmas = 14.6;
;
int main ()

Amžius klasė7;
cout << grade7.John << " << grade7.Joy << '\n';
grąžinti 0;

Specializuojantis, kampuose skliaustuose pateiktas pirmasis tipas int, labiau skirtas formalumui, siekiant įsitikinti, kad parametrų skaičius ir tvarka atitinka tipų (argumentų) skaičių ir tvarką. N vertė buvo pateikta specializuojantis. Rezultatas yra: 11 14.6.

Dalinė specializacija

Tarkime, kad šablone yra keturi bendrieji tipai ir kad tarp keturių tipų reikia dviejų numatytųjų tipų. Tai galima pasiekti naudojant dalinės specializacijos konstrukciją, kurioje nenaudojamas priskyrimo operatorius. Taigi dalinės specializacijos konstrukcija suteikia numatytąsias reikšmes bendrinių tipų pogrupiui. Tačiau dalinės specializacijos schemoje reikia bazinės klasės (struktūros) ir dalinės specializacijos klasės (struktūros). Ši programa iliustruoja tai vienam bendriniam tipui iš dviejų bendrų tipų:

# įtraukti
naudojant vardų sritį std;
// pagrindinio šablono klasė
šabloną
struktūros amžiai

;
// dalinė specializacija
šabloną
struktūros amžiai

T1 Jonas = 11;
plūduriuojantis Petras = 12.3;
T1 Marija = 13;
plūduriuojantis džiaugsmas = 14.6;
;
int main ()

Amžius klasė7;
cout << grade7.John << " << grade7.Joy << '\n';
grąžinti 0;

Nurodykite pagrindinės klasės deklaraciją ir jos dalinę klasės apibrėžtį. Pagrindinės klasės šablono ir galvos deklaracijoje yra visi būtini bendrieji parametrai. Dalinės specializacijos klasės deklaracijos šablone-galvoje yra tik bendro tipo. Schemoje naudojamas papildomas kampinių skliaustų rinkinys, kuris pateikiamas iškart po klasės pavadinimo dalinės specializacijos apibrėžime. Tai iš tikrųjų daro dalinę specializaciją. Jis turi numatytąjį ir nenumatytąjį tipą tokia tvarka, kokia parašyta pagrindinėje klasėje. Atkreipkite dėmesį, kad numatytajam tipui vis tiek gali būti suteiktas kitas tipas pagrindinėje () funkcijoje.

Atitinkamas pagrindinis () funkcijos kodas gali būti toks:

Amžius klasė7;
cout << grade7.John << " << grade7.Joy << '\n';

Rezultatas yra: 11 14.6.

Šablonų parametrų paketas

Parametrų paketas yra šablono parametras, kuris priima nulį ar daugiau bendrų šablonų tipų atitinkamiems duomenų tipams. Parametrų paketo parametras prasideda rezervuotu žodžiu typename arba class. Po to yra trys taškai, o tada - pakuotės identifikatorius. Ši programa parodo, kaip šablono parametrų paketą galima naudoti su „Struct“:

# įtraukti
naudojant vardų sritį std;
šabloną struktūros amžiai

int Jonas = 11;
plūduriuojantis Petras = 12.3;
int Marija = 13;
plūduriuojantis džiaugsmas = 14.6;
;
int main ()

Amžius B laipsnis;
cout << gradeB.John << " << gradeB.Mary << '\n';
Amžius laipsnisC;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Amžius laipsnisD;
cout << gradeD.John << " << gradeD.Joy << '\n';
Amžiai <> laipsnis A; // kaip numatytasis
cout << gradeA.John << " << gradeA.Joy << '\n';
grąžinti 0;

Rezultatas yra:

11 13
12.3 14.6
11 14.6
11 14.6

Funkcijų šablonai

Pirmiau minėtos šablono funkcijos panašiai taikomos ir funkcijų šablonams. Ši programa rodo funkciją su dviem bendrais šablono parametrais ir trim argumentais:

# įtraukti
naudojant vardų sritį std;
šabloną void func (T ne, U cha, const char * str)

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

int main ()

func (12, '$', "500");
grąžinti 0;

Rezultatas yra toks:

Parduotuvėje yra 12 knygų, kurių vertė 500 USD.

Atskyrimas nuo prototipo

Funkcijos apibrėžimą galima atskirti nuo jo prototipo, kaip rodo ši programa:

# įtraukti
naudojant vardų sritį std;
šabloną void func (T ne, U cha, const char * str);
šabloną void func (T ne, U cha, const char * str)

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

int main ()

func (12, '$', "500");
grąžinti 0;

Pastaba: Funkcijos šablono deklaracija negali būti rodoma pagrindinėje () ar kitoje funkcijoje.

Perkrovimas

Ta pati funkcija gali būti perkrauta naudojant skirtingas šablonų ir galvų deklaracijas. Tai iliustruoja ši programa:

# įtraukti
naudojant vardų sritį std;
šabloną void func (T ne, U cha, const char * str)

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

šabloną void func (T ne, const char * str)

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

int main ()

func (12, '$', "500");
func (12, "500");
grąžinti 0;

Rezultatas yra:

Parduotuvėje yra 12 knygų, kurių vertė 500 USD.

Parduotuvėje yra 12 knygų, kurių vertė 500 USD.

Klasės šablonai

Aukščiau paminėtų šablonų funkcijos panašiai taikomos ir klasės šablonams. Ši programa yra paprastos klasės deklaravimas, apibrėžimas ir naudojimas:

# įtraukti
naudojant vardų sritį std;
klasė „TheCla“

vieša:
int num;
statinis char ch;
negaliojantis func (char cha, const char * str)

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

statinis tuštumas (char ch)

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

;
int main ()

TheCla obj;
obj.skaičius = 12;
obj.func ('$', "500");
grąžinti 0;

Rezultatas yra toks:

Parduotuvėje yra 12 knygų, kurių vertė 500 USD.

Ši programa yra aukščiau nurodyta programa su deklaracijos šablonu ant galvos:

# įtraukti
naudojant vardų sritį std;
šabloną klasė „TheCla“

vieša:
T skaičius;
statinis U ch;
void func (U cha, const char * str)

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

statinis tuštumas (U ch)

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

;
int main ()

TheCla obj;
obj.skaičius = 12;
obj.func ('$', "500");
grąžinti 0;

Vietoje žodžio typename šablonų parametrų sąraše galima naudoti žodžių klasę. Atkreipkite dėmesį į specializaciją objekto deklaracijoje. Išvestis vis tiek ta pati:

Parduotuvėje yra 12 knygų, kurių vertė 500 USD.

Atskiroji deklaracija

Klasės šablono deklaraciją galima atskirti nuo klasės kodo taip:

šabloną klasė „TheCla“;
šabloną klasė „TheCla“

vieša:
T skaičius;
statinis U ch;
void func (U cha, const char * str)

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

statinis tuštumas (U ch)

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

;

Darbas su statiniais nariais

Ši programa parodo, kaip pasiekti statinių duomenų narį ir statinio nario funkciją:

# įtraukti
naudojant vardų sritį std;
šabloną klasė „TheCla“

vieša:
T skaičius;
statinis U ch;
void func (U cha, const char * str)

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

statinis tuštumas (U cha)

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

;
šabloną U TheCla:: ch = 'a';
int main ()

TheCla::linksma('.');
grąžinti 0;

Vertės priskyrimas statinių duomenų nariui yra deklaracija ir negali būti pagrindinis (). Priskyrimo sakinyje atkreipkite dėmesį į bendrųjų tipų ir duomenų bendrojo tipo naudojimą ir pozicijas. Be to, atkreipkite dėmesį, kad statinių duomenų nario funkcija buvo iškviesta main (), nurodant faktinius šablonų duomenų tipus. Rezultatas yra toks:

Oficiali statinio nario funkcija.

Kompiliavimas

Deklaracija (antraštė) ir šablono apibrėžimas turi būti viename faile. Tai yra, jie turi būti tame pačiame vertimo skyriuje.

Išvada

C ++ šablonai sukuria algoritmą, nepriklausantį nuo naudojamų duomenų tipo. Kintamojo, funkcijos, struktūros ir klasės subjektai gali turėti šablonus, kurie apima deklaravimą ir apibrėžimą. Kuriant šabloną taip pat reikalinga specializacija, tai yra tada, kai bendrasis tipas užima tikrąjį. Deklaracija ir šablono apibrėžimas turi būti viename vertimo skyriuje.

„Microsoft Sculpt Touch“ belaidžio pelės apžvalga
Neseniai skaičiau apie „Microsoft Sculpt Touch“ belaidę pelę ir nusprendė ją nusipirkti. Kurį laiką naudojęs, nusprendžiau pasidalinti savo patirtimi....
„AppyMouse“ ekrano „Trackpad“ ir pelės žymeklis, skirtas „Windows“ tabletėms
Planšetinių kompiuterių vartotojai dažnai praleidžia pelės žymeklį, ypač kai įprasta naudoti nešiojamus kompiuterius. Jutiklinio ekrano išmanieji tele...
Vidutinis pelės mygtukas neveikia sistemoje „Windows 10“
The vidurinis pelės mygtukas padeda naršyti ilgus tinklalapius ir ekranus, kuriuose yra daug duomenų. Jei tai sustos, gerai, jūs naudosite klaviatūrą ...