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:
szablonT 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:
szablonU 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:
szablonstruktura 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:
szablonstruktura 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:
szablonstruktura 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;
szablonstruktura 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;
szablonstruktura 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 13Szablony 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;
szablonvoid 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;
szablonvoid func (t no, u cha, const char *str);
szablonvoid 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;
szablonvoid func (t no, u cha, const char *str)
Cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
szablonvoid 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;
szablonklasa 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 ()
Theclaobj;
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:
szablonklasa thecla;
szablonklasa 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;
szablonklasa 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';
;
szablonU 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.