Udostępnij za pośrednictwem


Specyfikacje szablonu

template deklaracja określa zestaw klas sparametryzowanych lub funkcji.

template < template-parameter-list > declaration

Uwagi

Szablon parametru listy jest rozdzieloną przecinkami listą parametrów szablonu, które mogą być typami (w postaci klasyidentyfikator, nazwa typuidentyfikator, lub szablon < lista parametrów szablonu > klasa identyfikator) lub parametry typu używane w treści szablonu.Składnia parametru szablonu jest jedną z następujących czynności:

parameter-declaration
class identifier [ = typename ] 
typename identifier [ = typename ]
template < template-parameter-list > class [identifier][= name]

Możesz zainicjować wystąpienia szablonu klasy tak jakbyś tworzył wystąpienie normalnej klasy, ale musisz zawrzeć argumenty szablonu w nawiasach kątowych (<>).Te argumenty szablonu mogą być jakimkolwiek dowolnym typem, jeśli lista argumentów szablonu zawiera klasę lub typename słowo kluczowe lub wartość odpowiedniego typu, jeśli argument ma wartość argumentu nie będącego typem.Nie jest wymagana specjalna składnia do wywoływania funkcji szablonu, mimo że nawiasy i argumenty szablonu mogą być wymagane, jeśli parametrów szablonu nie można wywnioskować z argumentów funkcji.

Szablon parametru listy jest listą parametrów używanych przez funkcję szablonu, która określa, które części poniższego kodu będą się różnić.Na przykład:

template< class T, int i > class MyStack...

W tym przypadku szablon można otrzymywać typ (class T) i stały parametr (int i).Szablon będzie używać typu T i stałej liczby całkowitej i dla wystąpienia.W treści MyStack zgłoszenia, konieczne jest odwołanie się do T identyfikatora.

Sama deklaracja szablonu nie generuje kodu; określa rodzinę klas lub funkcji, z których jedna lub więcej zostanie wygenerowanych w momencie odwołania się innego kodu.

Deklaracje szablonu mają zakres globalny, przestrzeni nazw lub klas.Nie mogą one być zadeklarowane wewnątrz funkcji.

Poniższy przykład ilustruje deklarację, definicji i konkretyzacji szablonu klasy z parametrem typu T i parametrem szablonu-type i.

// template_specifications1.cpp
template <class T, int i> class TestClass 
{
public:
   char buffer[i];
   T testFunc(T* p1 );
};

template <class T, int i>
T TestClass<T,i>::testFunc(T* p1) 
{
    return *(p1++)
};

// To create an instance of TestClass
TestClass<char, 5> ClassInst;
int main()
{
}

Argumenty szablonu, które nie są typem

Parametry szablonu, które nie są typem muszą być całką, wyliczeniem, wskaźnikiem, odniesieniem lub wskaźnikiem do typu elementu członkowskiego i muszą być stałe w czasie kompilacji.Mogą być zakwalifikowane jako const lub lotne typy.Zmiennoprzecinkowe wartości nie są dozwolone jako parametry szablonu.Obiekty klasy, struktury lub typy związków nie są dozwolone jako parametry szablonu, które nie opisują typów, chociaż wskaźniki do takich obiektów są dozwolone.Tablice przekazywane jako parametry szablonu nie będące typem są konwertowane na wskaźniki.Funkcje przekazane jako parametry, które nie są typem są traktowane jako wskaźniki funkcji.Literały ciągów nie są dozwolone jako parametry szablonu.

Użycie nazwy typu w deklaracji szablonu

Słowo kluczowe typename może być zastosowane na liście szablonu parametrów.Następujące deklaracje szablonu są identyczne:

template< class T1, class T2 > class X...
template< typename T1, typename T2 > class X...

Argumenty domyślne dla parametrów szablonu

Szablony klas mogą posiadać argumenty domyślne określone za pomocą = znak, po którym następuje domyślny typ lub wartość.Szablony funkcji nie mogą mieć argumentów domyślnych.Aby uzyskać więcej informacji, zobacz Domyślne argumenty dla szablonów klas .:

template<typename Type> class allocator {};
template<typename Type, 
   typename Allocator = allocator<Type> > class stack 
{
};
stack<int> MyStack;

Ponowne użycie parametrów szablonu

Parametry szablonów mogą być ponownie zastosowane na liście szablonu parametrów.Na przykład, poniższy kod jest dozwolony:

// template_specifications2.cpp

class Y 
{
};
template<class T, T* pT> class X1 
{
};
template<class T1, class T2 = T1> class X2 
{
};

Y aY;

X1<Y, &aY> x1;
X2<int> x2;

int main()
{
}

Szablony jako parametry szablonów

Same parametry szablonu mogą być szablonami.Tej konstrukcji oznacza, że argument sam musi sam być szablonem, a nie klasą zbudowaną z szablonu.W poniższym przykładzie nazwę A parametru szablonu dla szablonu parametru szablonu można pominąć, ponieważ nie istnieje żaden sposób na jej użycie.

// template_specifications3.cpp
#include <stdio.h>

template <class T> struct str1
{
   T t;
};

template <template<class A> class T> struct str2
{
    T<int> t;
};

int main()
{
    str2<str1> mystr2;
    mystr2.t.t = 5;
    printf_s("%d\n", mystr2.t.t);
}

Dane wyjściowe

5

Odwołania jako parametry szablonu

Program Visual Studio .NET 2003 wprowadził możliwość używania odwołań jako parametrów szablonu-typu.To nie było możliwe w poprzednich wersjach.

// references__supported_as_nontype_template_parameters.cpp
#include <stdio.h>

extern "C" int printf_s(const char*,...);
template <int & ri> struct S
{
   S()
   {
      printf_s("ri is %d\n", ri);
   }

   ~S()
   {
      printf_s("ri is %d\n", ri);
   }
};

int i = 1;

int main()
{
   S<i> s;
   i = 0;
}

Dane wyjściowe

ri is 1
ri is 0

Wystąpienia zagnieżdżonych szablonów

Wersje programu Visual Studio przed Visual Studio 2005 wymagają, żeby odstępy były wstawione między listy parametrów szablonu podczas zgłoszenia wystąpień zagnieżdżonych szablonów.Teraz jest dozwolona następująca składnia:

// template_specifications4.cpp 

template <typename T> 
class A
{
};

template <int n> 
class B 
{
};

int main() 
{
   A<B<22>>();
}

Zobacz też

Informacje

Słowa kluczowe języka C++

Inne zasoby

Szablony