Sdílet prostřednictvím


Přehled šablon

Šablon, které se někdy nazývají parametrické typy jsou mechanismy pro generování funkcí a tříd na základě parametrů typu.Pomocí šablon můžete navrhnout jednu třídu nebo funkce, která pracuje s daty mnoha typů, namísto vytvoření samostatné třídy pro každý typ.

Poznámky

Například chcete-li vytvořit funkci typesafe, která vrátí minimálně dva parametry bez použití šablon zapisovat sadu přetížené funkce takto:

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

Pomocí šablon můžete snížit tato duplikace jedinou funkci šablony:

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

Šablony lze výrazně zmenšit velikost zdrojového kódu a zvýšit flexibilitu kód bez snížení bezpečnost typů.

Existují dva hlavní typy šablon: funkce šablony a šablony třídy.V předchozím příkladu min je funkce šablony.Šablona třídy je třída s parametrem, jako například:

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

Šablony jsou deklarovány a poněkud definována jako další funkce a třídy se některé významné rozdíly.Šablona prohlášení nedefinuje plně funkce nebo třídy; definuje pouze syntaktické kostra třídy nebo funkce.Funkce nebo třídy skutečné aplikace je vytvořena ze šablony proces se nazývá instance.K vytvoření instance jsou uvedené jednotlivých tříd nebo funkce, které jsou vytvořeny.Například šablony třídy:

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

slouží k vytvoření instance třídy pro A<int>, A<char>, A<int*>, A<MyClass*>, atd.

Vytváření instance třídy nebo funkcí lze provést explicitně nebo implicitně.Explicitní instance způsobem ven. v kódu verze šablony jsou generován.Implicitní vytváření instance umožňuje vytvořit instanci podle potřeby na místě, kde prvním použití šablon.

Šablony lze také parametrizovanou hodnotu parametru, ve kterém případě parametr šablony je deklarován jako parametr funkce.Jako hodnoty parametrů nejsou povoleny s plovoucí desetinnou čárkou typy a třídy.

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

Běžné potíže s šablony je, že mohou být one-size-fits-all roztoku, což znamená, že stejný kód vztahuje na všechny typy.Pokud potřebujete upravit šablony pro konkrétní typ chování, můžete použít specializace.Použití explicitní specializace lze speciální šablonu pro určitý typ reálné, není obecný typ.Šablona třídy mohou také být částečně specializované, což je užitečné, pokud máte šablonu s více parametry typu a chcete přizpůsobit chování vůči některé, ale ne všechny parametry.Částečné specializace je stále obecná a je třeba šablonu skutečné argumenty vyrábět skutečné vytvořenou instanci třídy.

Viz také

Další zdroje

Šablony