Jak używać szablonów C ++

Jak używać szablonów C ++
W podstawowym programowaniu C ++ typ danych, e.G., int lub char, należy wskazać w deklaracji lub definicji. Wartość taka jak 4 lub 22 lub -5 to int. Wartość taka jak „a” lub „b” lub „c” jest charakterem. Mechanizm szablonu pozwala programistowi używać typu ogólnego dla zestawu rzeczywistych typów. Na przykład programista może zdecydować o użyciu identyfikatora t dla INT lub Char. Możliwe jest, że algorytm C ++ ma więcej niż jeden typ ogólny. Z, powiedzmy, dla INT lub char, możesz oznaczać typ pływaku lub wskaźnika. Klasa, taka jak klasa String lub wektor, jest jak typ danych, a obiekty utworzone są jak wartości typu danych, co jest określoną klasą. Tak więc mechanizm szablonu pozwala również programistowi użyć ogólnego identyfikatora typu dla zestawu klas.

Szablon C ++ tworzy algorytm niezależny od rodzaju zastosowanych danych. Tak więc ten sam algorytm, z wieloma występami tego samego typu, może używać różnych typów w różnych wykonaniach. Jednostki o zmiennej, funkcji, strukturze i klasie mogą mieć szablony. W tym artykule wyjaśniono, jak zadeklarować szablony, jak zdefiniować szablony i jak je zastosować w C++. Powinieneś już mieć wiedzę na temat wyżej wymienionych podmiotów, aby zrozumieć tematy omówione w tym artykule.

Typy

Skalarny

Typy skalarne są nieważne, bool, char, int, float i wskaźnik.

Zajęcia jako typy

Konkretną klasę można uznać za typ i jej obiekty jako możliwe wartości.

Typ ogólny reprezentuje zestaw typów skalarnych. Lista typów skalarnych jest obszerna. Typ int, na przykład, ma inne powiązane typy, takie jak Short Int, Long Int itp. Typ ogólny może również reprezentować zestaw klas.

Zmienny

Przykład deklaracji i definicji szablonu jest następujący:

szablon T PI = 3.14;

Przed kontynuowaniem zauważ, że tego rodzaju stwierdzenie nie może pojawić się w funkcji Main () ani żadnego zakresu bloków. Pierwszy wiersz jest deklaracją szablonu, z ogólną nazwą typu, t-nazwa, t, t. Następny wiersz to definicja identyfikatora, PI, który jest typu ogólnego, t. Precyzja, czy T jest INT, Float, czy inny typ, można wykonać w funkcji C ++ Main () (lub innej funkcji). Taka precyzja zostanie wykonana ze zmienną PI, a nie t.

Pierwszy wiersz to deklaracja szablonu. Ta deklaracja zaczyna się od zarezerwowanego słowa, szablonu, a następnie otwartego i zamkniętego nawiasów kątowych. W nawiasach kątowych znajduje się co najmniej jeden ogólny identyfikator typu, taki jak t, powyżej. Może istnieć więcej niż jeden ogólny identyfikator typu, z którym każdy poprzedzony zarezerwowanym słowem, typenaMe. Takie typy ogólne w tej pozycji nazywane są parametrami szablonu.

Poniższe stwierdzenie można zapisać w Main () lub w dowolnej innej funkcji:

Cout << pi << '\n';

A funkcja wyświetliłaby 3.14. Wyrażenie Pi decyduje o dokładnym rodzaju t dla zmiennej PI. Specjalizacja decyduje o konkretnym typie danych dla parametru szablonu. Instant jest wewnętrznym procesem C ++ tworzenia konkretnego typu, takiego jak pływak, w tym przypadku. Nie myl między instancją parametru szablonu a instancją klasy. W temacie szablonu wiele typów danych może mieć jedną ogólną nazwę typu, podczas gdy wiele klas może mieć jedną ogólną nazwę klas. Jednak ogólna nazwa klas dla zajęć jest po prostu określana jako klasa, a nie jako nazwa klasy. Ponadto wartość jest typem danych, takim jak INT, jako obiekt utworzony, jest klasa, taka jak klasa ciągów.

Przy specjalizacji wybrany typ danych, taki jak pływak, jest umieszczany w nawiasach kątowych po zmiennej. Jeśli w deklaracji szablonu jest więcej niż jeden szablon, będzie odpowiedni liczba typów danych w tej samej kolejności w wyrażeniu specjalizacji.

W specjalizacji typ jest znany jako argument szablonu. Nie myl między tym a argumentem funkcji pod kątem wywołania funkcji.

Typ domyślny

Jeśli nie podano żadnego typu podczas specjalizacji, zakłada się, że typ domyślny. Tak więc z następującego wyrażenia:

szablon U pi = "love";

KAMA jest używana jako taka z domyślnym typem:

Cout << pi << '\n';

Przy czym „miłość” dla stałego wskaźnika do char jest używana jako domyślna z szablonu. Uwaga w deklaracji, że u = const char*. Wsporniki kątowe będą puste w specjalizacji (brak podawania); Rzeczywisty typ jest uważany za wskaźnik const na charakter, domyślny typ. Gdyby jakiś inny typ był potrzebny w specjalizacji, nazwa typu zostałaby zapisana w nawiasach kąta. Gdy domyślny typ jest pożądany podczas specjalizacji, powtarzanie typu w nawiasach kąta jest opcjonalne, i.mi., wsporniki kątowe można pozostawić puste.

Uwaga: domyślny typ można nadal zmienić w specjalizacji, mając inny typ.

struct

Poniższy przykład pokazuje, w jaki sposób parametr szablonu można użyć ze struct:

szablon struktura wieków

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

Są to wieki uczniów w klasie (klasa). Pierwszy wiersz jest deklaracją szablonu. Ciało w aparat ortodontycznych jest faktyczną definicją szablonu. Wiek można wyprowadzić w funkcji Main () z następującymi:

Wieczność 7 klasa;
Cout << grade7.John << " << grade7.Mary << '\n';

Wyjście to: 11 13. Pierwsze stwierdzenie tutaj wykonuje specjalizację. Zwróć uwagę, jak to zostało wykonane. Daje również nazwę obiektu struktury: klasy7. Drugie stwierdzenie ma zwykłe wyrażenia obiektów struktury. Struktura jest jak klasa. Tutaj wiek jest jak nazwa klasy, a klasa 7 jest przedmiotem klasy (struct).

Jeśli niektóre wieki są liczbami całkowitymi, a inne są pływakami, struktura potrzebuje dwóch parametrów ogólnych, w następujący sposób:

szablon struktura wieków

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

Odpowiedni kod funkcji main () jest następujący:

Wieczność 7 klasa;
Cout << grade7.John << " << grade7.Peter << '\n';

Wyjście to: 11 12.3. Przy specjalizacji kolejność typów (argumentów) musi odpowiadać kolejności typów ogólnych w deklaracji.

Deklaracja szablonu można oddzielić od definicji, jak następuje:

szablon struktura wieków

T John;
U Peter;
T Mary;
Jesteś radością;
;
Wieczność Grade7 = 11, 12.3, 13, 14.6;

Pierwszy segment kodu jest wyłącznie deklaracją szablonu (nie ma przypisań). Drugi segment kodu, który jest tylko stwierdzeniem, to definicja identyfikatora, klasy7. Lewa po stronie to deklaracja identyfikatora, klasa 7. Po stronie prawej to lista inicjalizacyjna, która przypisuje odpowiednie wartości członkom struktury. Drugi segment (instrukcja) można zapisać w funkcji Main (), podczas gdy pierwszy segment pozostaje poza funkcją Main ().

Nie typowy

Przykłady typów bez DATA obejmują INT, wskaźnik do obiektu, wskaźnik do funkcji i automatyczne typy. Istnieją inne typy, których ten artykuł nie rozwiązuje. Nieprzestrzeni jest jak niekompletny typ, którego wartość jest podana później i nie można jej zmienić. Jako parametr zaczyna się od konkretnego typu, a następnie identyfikatora. Wartość identyfikatora jest podana później, przy specjalizacji i nie można jej ponownie zmienić (jak stała, której wartość podano później). Poniższy program ilustruje to:

#włączać
za pomocą przestrzeni nazw Std;
szablon struktura wieków

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

Wieczność 7 klasa;
Cout << grade7.John << " << grade7.Joy << '\n';
powrót 0;

Przy specjalizacji pierwszy typ, int, w nawiasach kątowych jest więcej dla formalności, aby upewnić się, że liczba i kolejność parametrów odpowiadają liczbie i kolejności typów (argumenty). Wartość n została podana podczas specjalizacji. Wyjście to: 11 14.6.

Częściowa specjalizacja

Załóżmy, że szablon ma cztery typy ogólne i że spośród czterech typów istnieje potrzeba dwóch typów domyślnych. Można to osiągnąć za pomocą częściowej konstrukcji specjalizacji, która nie wykorzystuje operatora przypisania. Tak więc częściowa konstrukcja specjalizacji podaje wartości domyślne podzbiorze typów ogólnych. Jednak w schemacie częściowej specjalizacji potrzebna jest klasa podstawowa (struktura) i częściowa klasa specjalizacji (struktura). Poniższy program ilustruje to dla jednego typu ogólnego z dwóch typów ogólnych:

#włączać
za pomocą przestrzeni nazw Std;
// klasa szablonu podstawowego
szablon
struktura wieków

;
// Częściowa specjalizacja
szablon
struktura wieków

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

Wieczność 7 klasa;
Cout << grade7.John << " << grade7.Joy << '\n';
powrót 0;

Zidentyfikuj deklarację klasy podstawowej i jej częściową definicję klasy. Deklaracja szablonu klasy podstawowej ma wszystkie niezbędne parametry ogólne. Deklaracja szablonu czołowej klasy specjalizacji ma tylko typ ogólny. W schemacie pojawia się dodatkowy zestaw nawiasów kątowych, który pojawia się tuż po nazwie klasy w częściowej definicji specjalizacji. To właśnie robi częściowa specjalizacja. Ma domyślny typ i typ bez default, w kolejności zapisanej w klasie podstawowej. Należy zauważyć, że domyślnym typem może być nadal podany inny typ w funkcji Main ().

Odpowiedni kod w funkcji main () może być następujący:

Wieczność 7 klasa;
Cout << grade7.John << " << grade7.Joy << '\n';

Wyjście to: 11 14.6.

Szablon pakiet parametrów

Pakiet parametrów to parametr szablonu, który akceptuje zero lub więcej typów ogólnych dla odpowiednich typów danych. Parametr pakietu parametrów zaczyna się od zarezerwowanego słowa typena lub klasę. Następnie następują trzy kropki, a następnie identyfikator pakietu. Poniższy program ilustruje, w jaki sposób można użyć pakietu parametrów szablonu z strukturem:

#włączać
za pomocą przestrzeni nazw Std;
szablon struktura wieków

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

Wieczność ocena;
Cout << gradeB.John << " << gradeB.Mary << '\n';
Wieczność Gradec;
Cout << gradeC.Peter << " << gradeC.Joy << '\n';
Wieczność oceniany;
Cout << gradeD.John << " << gradeD.Joy << '\n';
Gina lat; // jak domyślnie
Cout << gradeA.John << " << gradeA.Joy << '\n';
powrót 0;

Wyjście to:

11 13
12.3 14.6
11 14.6
11 14.6

Szablony funkcji

Funkcje szablonu wymienione powyżej mają zastosowanie w podobny sposób do szablonów funkcji. Poniższy program pokazuje funkcję z dwoma ogólnymi parametrami szablonu i trzema argumentami:

#włączać
za pomocą przestrzeni nazw Std;
szablon 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”);
powrót 0;

Wyjście jest następujące:

W sklepie jest 12 książek o wartości 500 USD.

Oddzielenie od prototypu

Definicję funkcji można oddzielić od jej prototypu, jak pokazuje następujący program:

#włączać
za pomocą przestrzeni nazw Std;
szablon void func (t no, u cha, const char *str);
szablon 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”);
powrót 0;

Notatka: Deklaracja szablonu funkcji nie może pojawić się w funkcji main () lub w żadnej innej funkcji.

Przeciążenie

Przeciążenie tej samej funkcji może odbywać się z różnymi deklaracjami szablonu. Poniższy program ilustruje to:

#włączać
za pomocą przestrzeni nazw Std;
szablon void func (t no, u cha, const char *str)
Cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

szablon 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”);
powrót 0;

Wyjście to:

W sklepie jest 12 książek o wartości 500 USD.

W sklepie jest 12 książek o wartości 500 USD.

Szablony klas

Funkcje szablonów wymienionych powyżej mają zastosowanie w podobny sposób do szablonów klasowych. Poniższy program to deklaracja, definicja i użycie prostej klasy:

#włączać
za pomocą przestrzeni nazw Std;
klasa thecla

publiczny:
int num;
STATICA CH Ch;
void Func (Char Cha, const char *str)
Cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

Static void Fun (char c)
if (ch == 'a')
Cout << "Official static member function" << '\n';

;
int main ()

Thecla obj;
obj.num = 12;
obj.FUNC („$”, „500”);
powrót 0;

Wyjście jest następujące:

W sklepie jest 12 książek o wartości 500 USD.

Poniższy program jest powyższym programem z deklaracją szablonu:

#włączać
za pomocą przestrzeni nazw Std;
szablon klasa thecla

publiczny:
T num;
statyczny 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”);
powrót 0;

Zamiast słowa typeName na liście parametrów szablonu można użyć klasy słów. Zwróć uwagę na specjalizację w deklaracji obiektu. Wyjście jest nadal takie same:

W sklepie jest 12 książek o wartości 500 USD.

Oddzielenie deklaracji

Deklaracja szablonu klasy można oddzielić od kodu klasy, w następujący sposób:

szablon klasa thecla;
szablon klasa thecla
publiczny:
T num;
statyczny 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';

;

Radzenie sobie ze statycznymi członkami

Poniższy program pokazuje, jak uzyskać dostęp do statycznego elementu danych i funkcji statycznego członka:

#włączać
za pomocą przestrzeni nazw Std;
szablon klasa thecla
publiczny:
T num;
statyczny 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 cha)
if (ch == 'a')
Cout << "Official static member function" << cha << '\n';

;
szablon U thecla:: CH = „A”;
int main ()

Thecla::zabawa('.');
powrót 0;

Przypisanie wartości do statycznego elementu danych jest deklaracją i nie może być w Main (). Zwróć uwagę na użycie i pozycje typów ogólnych oraz typ ogólny danych w instrukcji przypisania. Ponadto zauważ, że funkcja statycznego elementu danych została wywołana w Main (), z rzeczywistymi typami danych szablonów. Wyjście jest następujące:

Oficjalna funkcja członka statycznego.

Kompilacja

Deklaracja (nagłówek) i definicja szablonu muszą znajdować się w jednym pliku. To znaczy, że muszą być w tej samej jednostce tłumaczenia.

Wniosek

Szablony C ++ powodują algorytm niezależny od rodzaju zastosowanych danych. Podmioty zmiennej, funkcji, struktury i klasy mogą mieć szablony, które obejmują deklarację i definicję. Tworzenie szablonu obejmuje również specjalizację, czyli wtedy, gdy typ ogólny przyjmuje rzeczywisty typ. Deklaracja i definicja szablonu muszą znajdować się w jednej jednostce tłumaczenia.