Udostępnij za pośrednictwem


Przegląd szablonów

Szablony, które czasami są nazywane typami z parametrami, są mechanizmami generowania funkcji i klas na podstawie typów parametrów.Za pomocą szablonów, można zaprojektować pojedynczą klasę lub funkcję, która operuje na danych wielu typów, nie trzeba tworzyć osobnej klasy dla każdego typu.

Uwagi

Na przykład, aby utworzyć funkcję bezpieczną pod względem typu, która zwraca wartość minimalną z dwóch parametrów bez użycia szablonów, należy napisać zestaw przeciążonych funkcji podobny do tego:

// what_are_templates1.cpp
// compile with: /c
// min for ints
int min( int a, int b ) {
   return ( a < b ) ? a : b;
}

// min for longs
long min( long a, long b ) {
   return ( a < b ) ? a : b;
}

// min for chars
char min( char a, char b ) {
   return ( a < b ) ? a : b;
}

Za pomocą szablonów, można zmniejszyć takie duplikowanie do pojedynczego szablonu funkcji:

// what_are_templates2.cpp
// compile with: /c
template <class T> T min( T a, T b ) {
   return ( a < b ) ? a : b;
}

Szablony mogą znacznie zmniejszyć rozmiar kodu źródłowego i zwiększyć elastyczność kodu bez ograniczania bezpieczeństwa typu.

Istnieją dwa główne typy szablonów: szablony funkcji i szablony klas.W poprzednim przykładzie, min jest szablonem funkcji.Szablon klasy jest klasą z parametrem, taką jak:

// what_are_templates3.cpp
template <class T> class A {
   T m_t;
   public:
      A(T t): m_t(t) {} 
      void f(T t);
};

int main() {
   A<int> a(10);
}

Szablony są deklarowane i definiowane nieco jak inne funkcje i klasy, z kilkoma większymi różnicami.Deklaracja szablonu nie definiuje w pełni funkcji lub klasy; definiuje tylko syntaktyczny szkielet dla klasy lub funkcji.Rzeczywista klasa lub funkcja jest tworzona z szablonu w procesie nazywanym wywoływanym tworzeniem wystąpienia.Poszczególne utworzone klasy lub funkcje są określane jako instancje.Na przykład, szablon klasy:

template <class T> struct A { . . . };

może zostać użyty do tworzenia wystąpienia klas dla A<int>, A<char>, A<int*>, A<MyClass*>, i tak dalej.

Tworzenie wystąpień klas lub funkcji może odbywać się jawnie lub niejawnie.Jawne tworzenie wystąpienia jest sposobem wywoływania w kodzie wersji szablonu, która ma być wygenerowana.Niejawne tworzenie wystąpienia pozwala szablonom na tworzenie wystąpień w razie potrzeby w punkcie, gdzie są używane po raz pierwszy.

Szablony mogą również zostać sparametryzowane przez wartość parametru, w którym to przypadku parametr szablonu deklarowany jest jak parametr do funkcji.Zmiennoprzecinkowe typy i klasy nie są dozwolone jako wartości parametrów.

// what_are_templates4.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

template <int i> class A {
   int array[i];
public:
   A() { memset(array, 0, i*sizeof(int)); }
};

int main() {
   A<10> a;
}

Powszechny problem z szablonami to możliwość zastosowania uniwersalnych rozwiązań, co oznacza, że ten sam kod stosuje się do wszystkich typów.Jeżeli trzeba dostosować zachowanie szablonu dla określonego typu, można użyć specjalizacji.Przy użyciu jawnych specjalizacji, szablon można wyspecjalizować dla określonego rzeczywistego typu, nie typu ogólnego.Szablon klasy może również być częściowo wyspecjalizowany, co jest przydatne, jeśli użytkownik ma szablon z wieloma parametrami typu i chce dostosować zachowanie w odniesieniu do niektórych, ale nie wszystkich parametrów.Częściowa specjalizacja jest nadal generyczna i wymaga rzeczywistych argumentów szablonu do produkcji rzeczywistego wystąpienia klasy.

Zobacz też

Inne zasoby

Szablony