Sdílet prostřednictvím


Šablony funkcí

Šablony třídy definují skupinu souvisejících tříd, které jsou založeny na typech argumentů předaných při vytváření instance třídy. Šablony funkce jsou podobné jako šablony třídy, ale definují skupinu funkcí. Pomocí šablon funkce lze určit sadu funkcí, které jsou založeny na stejném kódu, ale pracují s různými typy nebo třídami. Následující šablona funkce zamění dvě položky:

// function_templates1.cpp
template< class T > void MySwap( T& a, T& b ) {
   T c(a);
   a = b;
   b = c;
}
int main() {
}

Tento kód definuje skupinu funkcí, které zamění hodnoty argumentů. Z této šablony můžete generovat funkce, které prohodí int typy a long také uživatelem definované typy. Šablona funkce MySwap dokonce provede záměnu tříd, pokud je správně definován kopírovací konstruktor a operátor přiřazení těchto tříd.

Šablona funkce vám navíc zabrání v prohození objektů různých typů, protože kompilátor zná typy parametrů a b v době kompilace.

Přestože lze tuto funkci pomocí ukazatelů typu void provést pomocí nešablonové funkce, verze s šablonou je typově bezpečná. Vezměte v úvahu následující volání:

int j = 10;
int k = 18;
CString Hello = "Hello, Windows!";
MySwap( j, k );          //OK
MySwap( j, Hello );      //error

Druhé volání funkce MySwap vyvolá chybu v době kompilace, protože kompilátor nemůže funkci MySwap vygenerovat s parametry různých typů. Pokud byly použity ukazatele typu void, obě volání funkce se zkompilují správně, ale tato funkce nebude v době spuštění fungovat správně.

Explicitní určení argumentů šablony pro šablonu funkce je povoleno. Příklad:

// function_templates2.cpp
template<class T> void f(T) {}
int main(int j) {
   f<char>(j);   // Generate the specialization f(char).
   // If not explicitly specified, f(int) would be deduced.
}

Pokud je argument šablony explicitně zadán, jsou provedeny normální implicitní převody pro převod argumentu funkce na typ odpovídající parametrům šablony funkce. V předchozím příkladu kompilátor převede j na typ char.

Viz také

Šablony
Vytváření instancí šablon funkce
Explicitní vytvoření instance
Explicitní specializace šablon funkcí