C ++

A C ++ sablonok használata

A C ++ sablonok használata

Bevezetés

Az alapvető C ++ programozásnál az adattípus, pl.g., int vagy char, nyilatkozatban vagy meghatározásban kell feltüntetni. Olyan érték, mint 4 vagy 22 vagy -5 int. Az olyan érték, mint az „A”, „b” vagy „c”, char. A sablonmechanizmus lehetővé teszi a programozó számára, hogy egy általános típust használjon a tényleges típusok halmazához. Például a programozó dönthet úgy, hogy a T azonosítót használja int vagy char használatához. Lehetséges, hogy egy C ++ algoritmusnak egynél több általános típusa legyen. Mondjuk T-vel az int vagy char esetében, U állhat az úszó vagy mutató típusra. Egy osztály, például a karakterlánc vagy a vektorosztály, olyan, mint egy adattípus, a példányosított objektumok pedig az adattípus értékei, amely a megadott osztály. Tehát a sablon mechanizmus lehetővé teszi a programozó számára, hogy általános típusú azonosítót használjon egy osztálykészlethez.

A C ++ sablon létrehoz egy algoritmust, amely független a felhasznált adatok típusától. Tehát ugyanaz az algoritmus, sok azonos típusú előfordulással, különböző típusokat használhat különböző végrehajtásoknál. A változó, függvény, struktúra és osztály entitásainak lehetnek sablonjai. Ez a cikk elmagyarázza, hogyan kell deklarálni a sablonokat, hogyan kell meghatározni a sablonokat, és hogyan kell alkalmazni őket a C-ben++. A cikkben tárgyalt témák megértéséhez már ismernie kell a fent említett entitásokat.

Típusok

Skalár

A skaláris típusok: void, bool, char, int, float és pointer.

Osztályok mint típusok

Egy adott osztály típusnak tekinthető, objektumai pedig lehetséges értékként.

Egy általános típus skaláris típusok halmazát jelenti. A skaláris típusok listája kiterjedt. Az int típusnak például vannak más kapcsolódó típusai, például rövid int, hosszú int stb. Egy általános típus osztályok halmazát is képviselheti.

Változó

A sablon deklarációra és meghatározásra példa a következő:

sablon
T pi = 3.14;

Mielőtt folytatná, vegye figyelembe, hogy ez a fajta utasítás nem jelenhet meg a main () függvényben vagy bármely blokk hatókörben. Az első sor a sablon-fej deklaráció, a programozó által kiválasztott általános típusnévvel, T-vel. A következő sor a pi azonosító meghatározása, amely általános típusú, T. Pontosság, függetlenül attól, hogy a T int, úszó vagy valamilyen más típusú, elvégezhető a C ++ main () függvényben (vagy valamilyen más függvényben). Ilyen pontosságot a pi változóval kell végrehajtani, és nem T-vel.

Az első sor a sablon-fej deklaráció. Ez a nyilatkozat a fenntartott szóval, sablonnal, majd a nyitott és zárt szögletes zárójelekkel kezdődik. A szögletes zárójelek között legalább egy általános típusazonosító található, például T. Egynél több általános típusazonosító is lehet, mindegyiket megelőzi a fenntartott szó, a typename. Az ilyen általános típusokat abban a helyzetben sablonparamétereknek nevezzük.

Az alábbi állítás beírható a main () vagy bármely más függvénybe:

cout << pi << '\n';

És a funkció 3-at jelenítene meg.14. A pi kifejezés eldönti a pi változó T pontos típusát. A specializáció dönt a sablonparaméter adott adattípusáról. A példányosítás az adott típus, például az úszó létrehozásának C ++ belső folyamata ebben az esetben. Ne keverje össze a sablonparaméter és az osztály példányosítása között. A sablon témában sok adattípusnak lehet egy általános típusneve, míg sok osztálynak egy általános osztályneve lehet. Az osztályok általános osztálynevét azonban egyszerűen osztálynak nevezik, és nem osztálynévnek. Az érték egy adattípusra, például az int-re vonatkozik, mivel a példányosított objektum egy osztályra, például a String osztályra vonatkozik.

Szakosodáskor a választott adattípust, például az úszót, a változó után szögletes zárójelek közé kell helyezni. Ha egynél több sablonparaméter van a sablon-fej deklarációban, akkor a specializáció kifejezésben megfelelő számú adattípus lesz ugyanabban a sorrendben.

A specializációnál a típust sablon argumentumnak nevezik. Ne tévessze össze ezt és a függvényhívás argumentumát.

Alapértelmezett típus

Ha a specializációnál nem adnak meg típust, akkor az alapértelmezett típust feltételezzük. Tehát a következő kifejezésből:

sablon
U pi = "szerelem";
a kijelző:
cout << pi<> << '\n';

„szeretet” az állandó mutatóra a char-ra. A nyilatkozatban vegye figyelembe, hogy U = const char *. A szögletes zárójelek üresek lesznek a specializációnál (típus nincs megadva); a tényleges típust a char, az alapértelmezett típus mutatójának tekintjük. Ha valamilyen más típusra lenne szükség a specializáció során, akkor a típus nevét a szögletes zárójelbe kell írni. Amikor a specializációnál az alapértelmezett típust kívánja megadni, akkor a típus megismétlése a sarok zárójelben opcionális, azaz.e., a sarok zárójelek üresen hagyhatók.

Megjegyzés: az alapértelmezett típust a szakterületen továbbra is megváltoztathatja egy másik típus megadása.

strukturált

A következő példa bemutatja, hogyan lehet egy sablonparamétert használni egy struktúrával:

sablon strukturált korok

T János = 11;
T Péter = 12;
T Mária = 13;
T Öröm = 14;
;

Ezek egy évfolyam (osztály) tanulóinak életkora. Az első sor a sablon deklaráció. A zárójelben lévő test a sablon tényleges meghatározása. Az életkorok a main () függvényben adhatók meg az alábbiakkal:

Korok évfolyam7;
cout << grade7.John << " << grade7.Mary << '\n';

A kimenet: 11 13. Az első állítás itt végzi a specializációt. Vegye figyelembe, hogyan készült. Nevet ad a struct objektumának is: grade7. A második állítás rendes struktúra objektum kifejezéseket tartalmaz. A struktúra olyan, mint egy osztály. Itt az Ages olyan, mint egy osztály neve, míg a 7. osztály az osztály objektuma (struktúra).

Ha egyes korok egész számok, mások lebegők, akkor a struktúrának két általános paraméterre van szüksége, az alábbiak szerint:

sablon strukturált korok

T János = 11;
U Péter = 12.3;
T Mária = 13;
U Öröm = 14.6;
;

A main () függvény releváns kódja a következő:

Korok évfolyam7;
cout << grade7.John << " << grade7.Peter << '\n';

A kimenet: 11 12.3. A specializációnál a típusok (argumentumok) sorrendjének meg kell felelnie a deklarációban szereplő általános típusok sorrendjének.

A sablon deklaráció az alábbiak szerint választható el a definíciótól:

sablon strukturált korok

T János;
U Péter;
T Mária;
U Öröm;
;
Korok évfolyam7 = 11, 12.3, 13, 14.6;

Az első kódszegmens pusztán egy sablon deklarációja (nincs hozzárendelés). A második kódszegmens, amely csak utasítás, az azonosító, a grade7 meghatározása. A bal oldal az azonosító, a 7. fokozat deklarációja. A jobb oldali az inicializáló lista, amely hozzárendeli a megfelelő értékeket a struktúra tagokhoz. A második szegmens (utasítás) a main () függvénybe írható, míg az első szegmens a main () függvényen kívül marad.

Nem típus

Példák a nem adattípusokra: int, pointer to object, pointer to function és auto type. Vannak más nem típusok, amelyekkel ez a cikk nem foglalkozik. A nem típus olyan, mint egy hiányos típus, amelynek értékét később adják meg, és nem változtatható meg. Paraméterként egy adott nem típussal kezdődik, amelyet egy azonosító követ. Az azonosító értékét később adjuk meg, szakosodáskor, és nem változtatható meg újra (mint egy állandó, amelynek értékét később adjuk meg). A következő program ezt szemlélteti:

#include
névtér használata std;
sablon strukturált korok

T János = N;
U Péter = 12.3;
T Mary = N;
U Öröm = 14.6;
;
int main ()

Korok évfolyam7;
cout << grade7.John << " << grade7.Joy << '\n';
visszatér 0;

A szakosodásnál az első típusú, int, a szögletes zárójelben inkább a formalitás, annak biztosítása, hogy a paraméterek száma és sorrendje megfeleljen a típusok (argumentumok) számának és sorrendjének. Az N értékét a szakirányon adtuk meg. A kimenet: 11 14.6.

Részleges specializáció

Tegyük fel, hogy egy sablonnak négy általános típusa van, és hogy a négy típus között két alapértelmezett típusra van szükség. Ez a részleges specializációs konstrukcióval érhető el, amely nem használja a hozzárendelés operátorát. Tehát a részleges specializációs konstrukció alapértelmezett értékeket ad az általános típusok egy részének. A részleges specializációs sémában azonban alaposztályra (struktúra) és részleges szakosztályra (struktúrára) van szükség. A következő program ezt szemlélteti a két általános típus közül egy általános típus esetében:

#include
névtér használata std;
// alapsablon osztály
sablon
strukturált korok

;
// részleges specializáció
sablon
strukturált korok

T1 János = 11;
úszó Péter = 12.3;
T1 Mária = 13;
úszó Öröm = 14.6;
;
int main ()

Korok évfolyam7;
cout << grade7.John << " << grade7.Joy << '\n';
visszatér 0;

Határozza meg az alaposztály deklarációt és annak részleges osztálydefinícióját. Az alaposztály sablon-fej deklarációja tartalmazza az összes szükséges általános paramétert. A részleges szakosztály sablon-fej deklarációja csak általános típust tartalmaz. A sémában van egy további szögletes zárójel, amely a részleges specializáció definíciójában közvetlenül az osztály neve után következik. A részleges specializáció valójában ez. Ennek alapértelmezett és nem alapértelmezett típusa van, az alaposztályba írt sorrendben. Ne feledje, hogy az alapértelmezett típus továbbra is adhat más típust a main () függvényben.

A main () függvény vonatkozó kódja a következő lehet:

Korok évfolyam7;
cout << grade7.John << " << grade7.Joy << '\n';

A kimenet: 11 14.6.

Sablonparaméter-csomag

A paramétercsomag olyan sablonparaméter, amely nulla vagy több általános sablontípust fogad el a megfelelő adattípusokhoz. A paramétercsomag paraméter a fenntartott typename vagy class szóval kezdődik. Ezt követi három pont, majd a csomag azonosítója. A következő program bemutatja, hogyan használható egy sablonparaméter-csomag egy struktúrával:

#include
névtér használata std;
sablon strukturált korok

int János = 11;
úszó Péter = 12.3;
int Mária = 13;
úszó Öröm = 14.6;
;
int main ()

Korok B osztály;
cout << gradeB.John << " << gradeB.Mary << '\n';
Korok évfolyamC;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Korok fokozatD;
cout << gradeD.John << " << gradeD.Joy << '\n';
Korosztályok> A fokozat; // mint alapértelmezett
cout << gradeA.John << " << gradeA.Joy << '\n';
visszatér 0;

A kimenet:

11 13
12.3 14.6
11 14.6
11 14.6

Funkciósablonok

A fent említett sablonfunkciók hasonló módon vonatkoznak a függvénysablonokra. A következő program két általános sablonparamétert és három argumentumot mutat be:

#include
névtér használata std;
sablon 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");
visszatér 0;

A kimenet a következő:

12 üzlet van 500 dollár értékben a boltban.

Elválasztás a prototípustól

A függvény meghatározása elválasztható prototípusától, amint azt a következő program mutatja:

#include
névtér használata std;
sablon void func (T no, U cha, const char * str);
sablon 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");
visszatér 0;

Megjegyzés: A függvénysablon-deklaráció nem jelenhet meg a main () vagy bármely más függvényben.

Túlterhelés

Ugyanazon függvény túlterhelése különböző sablon-fej deklarációkkal történhet. A következő program ezt szemlélteti:

#include
névtér használata std;
sablon void func (T no, U cha, const char * str)

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

sablon 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");
visszatér 0;

A kimenet:

12 üzlet van 500 dollár értékben a boltban.

12 üzlet van 500 dollár értékben a boltban.

Osztálysablonok

A sablonok fent említett tulajdonságai az osztálysablonokhoz hasonlóan érvényesek. A következő program egy egyszerű osztály deklarálása, meghatározása és használata:

#include
névtér használata std;
osztály TheCla

nyilvános:
int szám;
statikus char ch;
void func (char cha, const char * str)

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

statikus üresség (char ch)

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

;
int main ()

TheCla obj;
obj.szám = 12;
obj.func ('$', "500");
visszatér 0;

A kimenet a következő:

12 üzlet van 500 dollár értékben a boltban.

A következő program a fenti program, sablon-fej deklarációval:

#include
névtér használata std;
sablon osztály TheCla

nyilvános:
T szám;
statikus U ch;
void func (U cha, const char * str)

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

statikus üresség (U ch)

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

;
int main ()

TheCla obj;
obj.szám = 12;
obj.func ('$', "500");
visszatér 0;

A sablonparaméter-listában a typename szó helyett a szóosztály használható. Vegye figyelembe a szakterületet az objektum deklarációjában. A kimenet továbbra is ugyanaz:

12 üzlet van 500 dollár értékben a boltban.

Külön nyilatkozat

Az osztálysablon-deklaráció az alábbiak szerint választható el az osztálykódtól:

sablon osztály TheCla;
sablon osztály TheCla

nyilvános:
T szám;
statikus U ch;
void func (U cha, const char * str)

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

statikus üresség (U ch)

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

;

Statikus tagok kezelése

A következő program bemutatja, hogyan lehet elérni egy statikus adattagot és egy statikus tagfüggvényt:

#include
névtér használata std;
sablon osztály TheCla

nyilvános:
T szám;
statikus U ch;
void func (U cha, const char * str)

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

statikus üresség (U cha)

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

;
sablon U TheCla:: ch = 'a';
int main ()

TheCla:: fun ('.');
visszatér 0;

Az érték hozzárendelése egy statikus adattaghoz deklaráció és nem lehet fő (). Jegyezze fel a hozzárendelési utasításban az általános típusok és az általános adattípusok használatát és pozícióit. Ezenkívül vegye figyelembe, hogy a statikus adattag függvény meghívásra került a main () -ban, a tényleges sablon adattípusokkal együtt. A kimenet a következő:

Hivatalos statikus tag funkció.

Összeállítás

A deklarációnak (fejlécnek) és a sablon definíciójának egy fájlban kell lennie. Vagyis ugyanabban a fordítási egységben kell lenniük.

Következtetés

A C ++ sablonok algoritmust készítenek a felhasznált adatok típusától. A változó, függvény, struktúra és osztály entitásai lehetnek sablonokkal, amelyek deklarációt és definíciót tartalmaznak. A sablon létrehozása magában foglalja a specializálódást is, amikor az általános típus tényleges típust vesz fel. A deklarációnak és a sablon meghatározásának egyaránt egy fordítási egységben kell lennie.

SuperTuxKart Linuxhoz
A SuperTuxKart egy nagyszerű cím, amelynek célja, hogy ingyenesen hozza el a Mario Kart élményét Linux rendszerén. Elég kihívást jelentő és szórakozta...
Csata a Wesnoth bemutatóért
A Battle for Wesnoth az egyik legnépszerűbb nyílt forráskódú stratégiai játék, amelyet jelenleg játszhatsz. Ez a játék nem csak nagyon hosszú ideje fe...
0 A.D. Bemutató
A sok stratégiai játék közül 0 A.D. átfogó címként és nagyon mély, taktikus játékként képes kiemelkednie annak ellenére, hogy nyílt forráskódú. A játé...