Sdílet prostřednictvím


Specifikace šablony

Deklarace template určuje sadu parametrizovaných tříd nebo funkcí.

template < template-parameter-list > declaration

Poznámky

Proměnná template-parameter-list je čárkami oddělený seznam parametrů šablon, což mohou být typy (ve formě classidentifier, typenameidentifier nebo template < template-parameter-list > class identifier) nebo netypované parametry, které mají být použity v těle šablony.Syntaxe pro parametr šablony je jedna z následujících:

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

Můžete vytvořit instanci třídy šablony podobně jako byste vytvořili instanci běžné třídy, ale musíte zahrnout argumenty šablony v lomených závorkách (<>).Tyto argumenty šablony mohou být libovolného typu, pokud seznam argumentů šablony obsahuje třídu nebo klíčové slovo typename nebo hodnotu příslušného typu, pokud je argument netypovaný argument.Žádná speciální syntax není vyžadována pro volání šablony funkce, i když mohou být vyžadovány špičaté závorky a argumenty šablony, pokud nelze parametry šablony odvodit z argumentů funkce.

Proměnná template-parameter-list je seznam parametrů používaných šablonou funkce, která určuje, které části následujícího kódu se budou lišit.Příklad:

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

V takovém případě mohou šablony přijmout typ (class T) a konstantní parametr (int i).Šablona použije typ T a celočíselnou konstantu i při vytváření instance.V těle deklarace MyStack musíte odkazovat na identifikátor T.

Samotná deklarace šablony negeneruje kód; určuje řadu tříd a funkcí, jedna nebo více z nichž bude vygenerováno při odkazu jiným kódem.

Deklarace šablon jsou v oboru globálním, oboru názvů nebo třídy.Nemohou být deklarovány v rámci funkce.

Následující příklad ukazuje deklaraci, definici a vytvoření instance šablony třídy s parametrem typu T a netypovým parametrem šablony 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 šablony bez typu

Parametry šablony bez typu musí být typu integrál, výčet, ukazatel, odkaz nebo ukazatel na členský typ a musí být v době kompilace konstantní.Mohou být kvalifikovány jako typy const nebo volatile.Hodnoty s plovoucí desetinnou čárkou nejsou povoleny jako parametry šablony.Objekty typu třída, struktura nebo sjednocení nejsou povoleny jako parametry šablony bez typu, avšak jsou povoleny odkazy na tyto objekty.Pole předána jako parametry šablony bez typu jsou převedena na ukazatele.Funkce, které jsou předány jako parametry bez typu, jsou považovány za ukazatele na funkci.Textové literály nejsou povoleny jako parametry šablony.

Použití typename v deklaraci šablony

Klíčové slovo typename lze použít v seznamu parametrů šablony.Následující deklarace šablon jsou shodné:

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

Výchozí argumenty šablon parametry šablony

Šablony třídy mohou mít výchozí argumenty zadané pomocí znaku = následovaného výchozím typem nebo hodnotou.Šablony funkcí nemohou mít výchozí argumenty.Další informace naleznete v tématu Výchozí argumenty pro š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 povolen:

// 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 samy šablonami.Tato konstrukce znamená, že argument musí být sám šablonou, ne třídou vyrobenou z šablony.V následujícím příkladu název A parametru šablony pro parametr šablony lze vynechat, protože neexistuje žádný způsob, jak jej použít.

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

Výsledek

5

Odkazy jako parametry šablony

Visual Studio .NET 2003 zavádí možnost používat odkazy jako parametry šablony bez typu.To nebylo 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;
}

Výsledek

ri is 1
ri is 0

Vnořené instance šablony

Verze aplikace Visual Studio starší než Visual Studio 2005 vyžadovaly, aby byla mezi seznamy parametrů šablony vložena mezera, když byly deklarovány instance vnořených šablon.Nyní je povolena následující syntaxe:

// 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á slova jazyka C++

Další zdroje

Šablony