Sdílet prostřednictvím


Specifikace šablony

template Prohlášení určuje sadu parametrizované třídy nebo funkcí.

template < template-parameter-list > declaration

Poznámky

Seznam parametrů šablony je čárkami oddělený seznam parametrů šablony, které mohou být typy (ve formě třídyidentifikátor, typenameidentifikátor, nebo Šablona < seznam parametrů šablony > Třída identifikátor) nebo parametry-type má být použit v těle šablony.Syntaxe parametru šablony je jeden z následujících:

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

Můžete konkretizovat šablonu třídy mnohem jako by vytvořit instanci běžné třídy, ale musí obsahovat argumenty šablony v lomených závorkách (< >).Lze tyto argumenty šablony jakýkoli typ seznamu argument šablona obsahuje třídu nebo typename klíčové slovo nebo hodnotu příslušného typu, pokud je argument argument-type.Žádné speciální syntaxi je požadováno volání funkce šablony, ačkoli šablony argumentů a závorek může být požadována Pokud parametry šablony nemůže být odvozeno z argumenty funkce.

Seznam parametrů šablony je seznam parametrů, které používají funkce šablony, která určuje, které části následující kód se liší.Příklad:

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

V takovém případě lze šablony zobrazí typ (class T) a parametr konstantní (int i).Použije šablonu typu T a celočíselná konstanta i při vytváření instance.V rámci těla MyStack prohlášení, musí odkazovat na T identifikátor.

Samotné šablony prohlášení negeneruje kód; Určuje řadu tříd nebo funkce, jeden nebo více z nich bude vygenerován při odkazování na jiný kód.

Prohlášení šablony mají globální obor názvů a třídy oboru.Nemůže být deklarována v rámci funkce.

Následující příklad ukazuje prohlášení, definice a vytváření instance šablony třídy s parametr typu T parametr šablony-type a 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()
{
}

Šablony typu bez argumentů.

Parametry šablony typu non musí být nedílnou, výčet, ukazatele, odkaz nebo ukazatel na typ členu a musí být konstantní v době kompilace.Mohou být kvalifikovaný jako typy const nebo nestálá.Plovoucí desetinná čárka, že hodnoty nejsou povoleny jako parametry šablony.Objekty třídy, struct nebo typ union nejsou povoleny jako parametry šablony-type, přestože ukazatele na tyto objekty jsou povoleny.Pole předána jako parametry-type šablony budou převedeny na odkazy.Funkce ukazatele jsou považovány za funkce předána jako parametry-type.Řetězcové literály není povoleno jako parametry šablony.

Pomocí šablony prohlášení typename

název_typu Lze použít klíčové slovo v seznamu parametr šablony.Následující prohlášení šablony jsou shodné:

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

Argumenty výchozí parametry šablony

Třída šablony může mít výchozí argumenty zadané pomocí = znak následovaný výchozí typ nebo hodnotu.Funkce šablon nemůže mít výchozí argumenty.Další informace naleznete v Argumenty výchozí šablony třídy .:

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

Opětovné použití parametrů šablony

Parametry šablony lze znovu použít v seznamu parametr šablony.Například následující kód je povoleno:

// 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()
{
}

Šablony jako parametry šablony

Parametry šablony mohou být samotné šablony.Tuto konstrukci znamená, že argument musí samotné šablony není vyrobeno z šablony třídy.V následujícím příkladu název A šablony parametr pro parametr šablony šablony lze vynechat, protože neexistuje způsob, že mohou být použity.

// 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(cs-cz,VS.110).gifVýsledek

5

Odkazy jako parametry šablony

Visual Studio.NET 2003 zavádí možnost používat odkazy jako parametry šablony-type.To není povoleno v předchozích verzích.

// 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(cs-cz,VS.110).gifVýsledek

ri is 1
ri is 0

Vnořená instance šablony

Verze aplikace Visual Studio před Visual Studio 2005 povinné, že mezera mezi seznamy parametrů šablony, když byla deklarována instance vnořené šablony vkládá.Nyní je povolen následující syntaxi:

// template_specifications4.cpp 

template <typename T> 
class A
{
};

template <int n> 
class B 
{
};

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

Viz také

Referenční dokumentace

Klíčových slov jazyka C++

Další zdroje

Šablony