C ++

Jak používat šablony C ++

Jak používat šablony C ++

Úvod

V základním programování v C ++ je datový typ, např.G., int nebo char, musí být uvedeno v prohlášení nebo definici. Hodnota jako 4 nebo 22 nebo -5 je int. Hodnota jako „A“ nebo „b“ nebo „c“ je char. Mechanismus šablony umožňuje programátorovi použít obecný typ pro sadu skutečných typů. Například programátor se může rozhodnout použít identifikátor T pro int nebo char. Je možné, aby algoritmus C ++ měl více než jeden obecný typ. Řekněme, že T pro int nebo char, U může znamenat float nebo typ ukazatele. Třída, jako je řetězec nebo vektorová třída, je jako datový typ a instanční objekty jsou jako hodnoty datového typu, což je zadaná třída. Mechanismus šablony tedy také umožňuje programátorovi použít identifikátor obecného typu pro sadu tříd.

Šablona C ++ vytváří algoritmus nezávislý na typu použitých dat. Stejný algoritmus s mnoha výskyty stejného typu tedy může používat různé typy při různých provedeních. Entity proměnné, funkce, struktury a třídy mohou mít šablony. Tento článek vysvětluje, jak deklarovat šablony, jak definovat šablony a jak je použít v jazyce C++. Již byste měli mít znalosti o výše uvedených entitách, abyste porozuměli tématům pojednávaným v tomto článku.

Typy

Skalární

Skalární typy jsou void, bool, char, int, float a pointer.

Třídy jako typy

Konkrétní třídu lze považovat za typ a jeho objekty za možné hodnoty.

Obecný typ představuje sadu skalárních typů. Seznam skalárních typů je rozsáhlý. Typ int má například další související typy, například short int, long int atd. Obecný typ může také představovat sadu tříd.

Variabilní

Příklad deklarace šablony a definice je následující:

šablona
T pi = 3.14;

Než budete pokračovat, nezapomeňte, že tento druh výpisu se nemůže objevit ve funkci main () ani v žádném oboru bloku. První řádek je deklarace hlavy šablony s obecným názvem typu, zvoleným programátorem, T. Další řádek je definice identifikátoru, pi, který je obecného typu, T. Přesnost, zda je T int, float nebo nějaký jiný typ, lze provést ve funkci C ++ main () (nebo v jiné funkci). Taková přesnost bude provedena s proměnnou pi, a ne s T.

První řádek je deklarace hlavy šablony. Toto prohlášení začíná vyhrazeným slovem, šablonou a poté hranatými závorkami v otevřeném a uzavřeném úhlu. V hranatých závorkách je alespoň jeden obecný identifikátor typu, například T, výše. Může existovat více než jeden obecný identifikátor typu, přičemž každému předchází vyhrazené slovo, typename. Takové obecné typy na této pozici se nazývají parametry šablony.

Následující příkaz lze zapsat main () nebo do jakékoli jiné funkce:

cout << pi << '\n';

A funkce by zobrazila 3.14. Výraz pi rozhodne přesný typ T pro proměnnou pi. Specializace rozhoduje o konkrétním datovém typu pro parametr šablony. Instantiation je v tomto případě interní proces C ++ vytváření konkrétního typu, například float. Nezaměňujte mezi vytvořením instance parametru šablony a vytvořením instance třídy. V tématu šablony může mít mnoho datových typů jeden obecný název typu, zatímco mnoho tříd může mít jeden obecný název třídy. Obecný název třídy pro třídy se však jednoduše označuje jako třída, nikoli jako název třídy. Hodnota je také pro datový typ, jako je int, protože instanční objekt je pro třídu, jako je například třída String.

Při specializaci je vybraný datový typ, například float, umístěn za lomené závorky za proměnnou. Pokud je v deklaraci hlavy šablony více než jeden parametr šablony, bude ve výrazu specializace odpovídající počet datových typů ve stejném pořadí.

Při specializaci je typ známý jako argument šablony. Nezaměňujte mezi tímto a argumentem funkce pro volání funkce.

Výchozí typ

Pokud není při specializaci uveden žádný typ, předpokládá se výchozí typ. Takže z následujícího výrazu:

šablona
U pi = "láska";
displej z:
cout << pi<> << '\n';

je „láska“ pro konstantní ukazatel na char. Všimněte si v prohlášení, že U = const char *. Úhlové závorky budou při specializaci prázdné (není zadán žádný typ); skutečný typ je považován za ukazatel const na char, výchozí typ. Pokud by byl při specializaci zapotřebí nějaký jiný typ, pak by byl název typu zapsán do lomených závorek. Pokud je při specializaci požadován výchozí typ, je opakování typu v hranatých závorkách volitelné, tj.E., úhlové závorky mohou být prázdné.

Poznámka: Výchozí typ lze při specializaci stále změnit tím, že budete mít jiný typ.

struktur

Následující příklad ukazuje, jak lze použít parametr šablony se strukturou:

šablona strukturní věky

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

Jedná se o věk studentů ve třídě (třídě). První řádek je deklarace šablony. Tělo v závorkách je skutečnou definicí šablony. Věk lze ve funkci main () odeslat následujícím způsobem:

Věky stupeň7;
cout << grade7.John << " << grade7.Mary << '\n';

Výstup je: 11 13. První příkaz zde provádí specializaci. Všimněte si, jak to bylo vyrobeno. Poskytuje také název objektu struktury: grade7. Druhý příkaz má běžné výrazy strukturovaných objektů. Struktura je jako třída. Zde je Ages jako název třídy, zatímco stupeň 7 je objektem třídy (struktura).

Pokud jsou některé věkové skupiny celá čísla a jiné jsou plovoucí, pak struktura potřebuje dva obecné parametry, a to následovně:

šablona strukturní věky

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

Relevantní kód pro funkci main () je následující:

Věky stupeň7;
cout << grade7.John << " << grade7.Peter << '\n';

Výstup je: 11 12.3. Při specializaci musí pořadí typů (argumentů) odpovídat pořadí obecných typů v deklaraci.

Deklaraci šablony lze oddělit od definice následujícím způsobem:

šablona strukturní věky

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

První segment kódu je čistě deklarací šablony (neexistují žádná přiřazení). Druhý segment kódu, který je pouze příkazem, je definice identifikátoru, stupeň7. Na levé straně je deklarace identifikátoru, stupeň7. Na pravé straně je seznam inicializátorů, který přiřazuje odpovídající hodnoty členům struktury. Druhý segment (příkaz) lze zapsat do funkce main (), zatímco první segment zůstane mimo funkci main ().

Non-Type

Mezi příklady jiných než datových typů patří typy int, ukazatel na objekt, ukazatel na funkci a automatické typy. Existují i ​​jiné typy, kterým se tento článek nezabývá. Non-type je jako neúplný typ, jehož hodnota je uvedena později a nelze jej změnit. Jako parametr začíná konkrétním netypem, za nímž následuje identifikátor. Hodnota identifikátoru je uvedena později, při specializaci, a nelze ji znovu změnit (jako konstanta, jejíž hodnota je uvedena později). Ilustruje to následující program:

#zahrnout
pomocí jmenného prostoru std;
šablona strukturní věky

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

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

Ve specializaci je první typ int v hranatých závorkách více pro formálnost, aby se ujistil, že počet a pořadí parametrů odpovídá počtu a pořadí typů (argumentů). Hodnota N byla uvedena při specializaci. Výstup je: 11 14.6.

Částečná specializace

Předpokládejme, že šablona má čtyři obecné typy a že ze čtyř typů existuje potřeba dvou výchozích typů. Toho lze dosáhnout pomocí konstrukce částečné specializace, která nepoužívá operátora přiřazení. Konstrukce částečné specializace tedy dává výchozí hodnoty podmnožině obecných typů. V schématu částečné specializace je však potřeba základní třída (struktura) a třída částečné specializace (struktura). Následující program to ilustruje pro jeden obecný typ ze dvou obecných typů:

#zahrnout
pomocí jmenného prostoru std;
// základní třída šablony
šablona
strukturní věky

;
// částečná specializace
šablona
strukturní věky

T1 John = 11;
float Peter = 12.3;
T1 Mary = 13;
float Joy = 14.6;
;
int main ()

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

Identifikujte deklaraci základní třídy a její částečnou definici třídy. Deklarace hlavičky šablony základní třídy má všechny potřebné obecné parametry. Deklarace hlavičky šablony třídy částečné specializace má pouze obecný typ. Ve schématu, který přichází hned za názvem třídy v definici částečné specializace, je použita další sada úhlových závorek. To je to, co vlastně dělá částečnou specializaci. Má výchozí typ a nestandardní typ v pořadí zapsaném v základní třídě. Všimněte si, že výchozímu typu může být ve funkci main () stále přiřazen jiný typ.

Příslušný kód ve funkci main () může být následující:

Věky stupeň7;
cout << grade7.John << " << grade7.Joy << '\n';

Výstup je: 11 14.6.

Sada parametrů šablony

Sada parametrů je parametr šablony, který přijímá nula nebo více obecných typů šablon pro odpovídající datové typy. Parametr pack parametru začíná vyhrazeným slovem typename nebo class. Poté následují tři tečky a poté identifikátor balíčku. Následující program ukazuje, jak lze použít sadu parametrů šablony se strukturou:

#zahrnout
pomocí jmenného prostoru std;
šablona strukturní věky

int John = 11;
float Peter = 12.3;
int Mary = 13;
float Joy = 14.6;
;
int main ()

Věky stupeň B;
cout << gradeB.John << " << gradeB.Mary << '\n';
Věky stupeň C;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Věky stupeň D;
cout << gradeD.John << " << gradeD.Joy << '\n';
Věk <> stupeň A; // jako výchozí
cout << gradeA.John << " << gradeA.Joy << '\n';
návrat 0;

Výstupem je:

11 13
12.3 14.6
11 14.6
11 14.6

Šablony funkcí

Výše uvedené funkce šablon platí podobným způsobem jako šablony funkcí. Následující program ukazuje funkci se dvěma obecnými parametry šablony a třemi argumenty:

#zahrnout
pomocí jmenného prostoru std;
šablona 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 následující:

V obchodě je 12 knih v hodnotě 500 $.

Oddělení od prototypu

Definici funkce lze oddělit od jejího prototypu, jak ukazuje následující program:

#zahrnout
pomocí jmenného prostoru std;
šablona void func (T no, U cha, const char * str);
šablona 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: Deklarace šablony funkce se nemůže objevit ve funkci main () ani v žádné jiné funkci.

Přetížení

Přetížení stejné funkce může probíhat pomocí různých deklarací hlavy šablony. Ilustruje to následující program:

#zahrnout
pomocí jmenného prostoru std;
šablona void func (T no, U cha, const char * str)

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

šablona 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ýstupem je:

V obchodě je 12 knih v hodnotě 500 $.

V obchodě je 12 knih v hodnotě 500 $.

Šablony tříd

Funkce výše zmíněných šablon platí podobným způsobem jako šablony tříd. Následující program je deklarace, definice a použití jednoduché třídy:

#zahrnout
pomocí jmenného prostoru std;
třída TheCla

veřejnost:
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 následující:

V obchodě je 12 knih v hodnotě 500 $.

Následující program je výše uvedený program s deklarací hlavy šablony:

#zahrnout
pomocí jmenného prostoru std;
šablona třída TheCla

veřejnost:
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;

Místo názvu typu slova v seznamu parametrů šablony lze použít třídu slov. Všimněte si specializace v deklaraci objektu. Výstup je stále stejný:

V obchodě je 12 knih v hodnotě 500 $.

Oddělovací prohlášení

Deklaraci šablony třídy lze oddělit od kódu třídy následujícím způsobem:

šablona třída TheCla;
šablona třída TheCla

veřejnost:
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';

;

Jednání se statickými členy

Následující program ukazuje, jak získat přístup ke statickému datovému členu a statické členské funkci:

#zahrnout
pomocí jmenného prostoru std;
šablona třída TheCla

veřejnost:
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';

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

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

Přiřazení hodnoty statickému datovému členu je deklarace a nemůže být v main (). Všimněte si použití a pozic obecných typů a datového obecného typu v příkazu přiřazení. Kromě toho si všimněte, že členská funkce statických dat byla volána v main () se skutečnými datovými typy šablon. Výstup je následující:

Oficiální statická členská funkce.

Kompilace

Deklarace (záhlaví) a definice šablony musí být v jednom souboru. To znamená, že musí být ve stejné překladové jednotce.

Závěr

Díky šablonám C ++ je algoritmus nezávislý na typu použitých dat. Entity proměnné, funkce, struktury a třídy mohou mít šablony, které zahrnují deklaraci a definici. Vytvoření šablony také zahrnuje specializaci, což je situace, kdy obecný typ přebírá skutečný typ. Deklarace a definice šablony musí být v jedné překladové jednotce.

Trackpad a ukazatel myši AppyMouse na obrazovce pro tablety Windows
Uživatelé tabletů často postrádají ukazatel myši, zejména když obvykle používají notebooky. Dotykové smartphony a tablety mají mnoho výhod a jediným o...
Střední tlačítko myši nefunguje ve Windows 10
The prostřední tlačítko myši pomáhá procházet dlouhé webové stránky a obrazovky se spoustou dat. Pokud se to zastaví, budete nakonec používat klávesni...
Jak změnit levé a pravé tlačítko myši na počítači se systémem Windows 10
Je úplnou normou, že všechna zařízení počítačových myší jsou ergonomicky navržena pro praváky. K dispozici jsou však myší zařízení, která jsou speciál...