Udostępnij za pośrednictwem


Szablon specyfikacje

template Deklaracja określa zestaw klas sparametryzowanych lub funkcji.

template < template-parameter-list > declaration

Uwagi

Listy parametrów szablonu jest rozdzielana przecinkami lista parametrów szablonu, które mogą być typów (w postaci klasyidentyfikatora, typenameidentyfikatora, lub szablonu < Lista parametrów szablonu > Klasa identyfikatora) lub parametrów-type ma być używany 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]

Wystąpienia szablonu klasy znacznie jak byłoby wystąpienia klasy normalne, ale musi zawierać argumenty szablonu w nawiasy ostre (< >).Te argumenty szablonu mogą być dowolnego typu, jeżeli lista argumentów szablon zawiera klasę lub typename słowa kluczowego lub wartość odpowiedniego typu, jeśli argument jest argumentem-type.Nie specjalnej składni jest niezbędny do wywoływania szablon funkcji, mimo że nawiasy i argumenty szablonu może być wymagane, jeśli parametry szablonu nie mogą być wywnioskowane ze argumenty funkcji.

Listy parametrów szablonu jest lista parametrów używanych przez funkcję szablonu, która określa, które części następujący kod może się różnić.Na przykład:

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

W przypadku tego szablonu można otrzymywać typu (class T) i parametru o stałej (int i).Szablon będzie używać typu T i stałą całkowitą i na wystąpienia.W treści MyStack deklarację, należy zapoznać się z T identyfikatora.

Deklaracja szablonu, sama nie generuje kod; Określa, aby rodziny klas lub funkcje, jeden lub więcej, z których zostaną wygenerowane podczas odwołuje się inny kod.

Szablon deklaracji mają globalny, obszar nazw lub klasy zakres.Nie mogą one być zadeklarowana wewnątrz funkcji.

Poniższy przykład ilustruje deklarację, definicji i wystąpienia szablonu klasy z parametrem typu T i z 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 typu non szablonu

Parametry szablonu typu non musi być integralną, wyliczenie, wskaźnik, odwołanie lub wskaźnika do członka typu i muszą być stałe w czasie kompilacji.Mogą być zakwalifikowane jako typu const lub volatile.Liczba zmiennoprzecinkowa że wartości nie są dozwolone jako parametry szablonu.Obiekty klasy, struktury lub typu Unii nie są dozwolone jako parametry szablonu-type, chociaż wskaźniki do takich obiektów są dozwolone.Tablice są przekazywane jako parametry szablonu typu nie są konwertowane na wskaźniki.Funkcje przekazane jako parametry typu nie są traktowane jako wskaźników funkcji.Literały ciągów znaków nie są dozwolone jako parametry szablonu.

Za pomocą typename w deklaracji z szablonu

TypeName Można użyć słowa kluczowego, na liście parametrów szablonu.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 klasa może mieć argumentów domyślne określone za pomocą = znak, po której następuje domyślny typ lub wartość.Funkcja szablony nie mogą mieć argumenty domyślne.Aby uzyskać więcej informacji, zobacz Argumenty domyślne szablony klasy .:

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

Ponowne użycie parametrów szablonu

Parametry szablonu mogą być ponownie używane w liście parametrów szablonu.Na przykład poniższy kod jest dozwolone:

// 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 szablonu

Same parametry szablonu mogą być szablonów.Tej konstrukcji oznacza, że argument musi sam być szablonu, nie klasy zbudowane z szablonu.W poniższym przykładzie nazwa A szablonu można pominąć parametr dla parametru szablonu do szablonu, ponieważ nie istnieje żaden sposób, że może być używany.

// 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);
}

x5w1yety.collapse_all(pl-pl,VS.110).gifDane wyjściowe

5

Odwołania jako parametry szablonu

Program Visual Studio.NET 2003 wprowadzono możliwość korzystania z odwołań jako parametry szablonu-type.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;
}

x5w1yety.collapse_all(pl-pl,VS.110).gifDane wyjściowe

ri is 1
ri is 0

Zagnieżdżony szablon wystąpień

Wersje programu Visual Studio przed do programu Visual Studio 2005 wymagane, dodaje się że odstępy między listy parametrów szablonu podczas wystąpienia zagnieżdżony szablon zostały zgłoszone.Teraz jest dozwolone następującej składni:

// template_specifications4.cpp 

template <typename T> 
class A
{
};

template <int n> 
class B 
{
};

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

Zobacz też

Informacje

Słów kluczowych języka C++

Inne zasoby

Szablony