ŠABLONY
Šablona specifikuje, jak definovat skupinu příbuzných tříd. Mějme například vytvořenou třídu zásobník, která uchovává celá čísla. Budeme-li však chtít pracovat v zásobníku s řetězci znaků, je námi vytvořená třída nepoužitelná, přestože operace na zásobníku jsou stejné a jen se změnil datový typ jednotlivých hodnot na zásobníku.
Abychom nemuseli psát nový kód pro další datový typ, poskytuje jazyk C++ nástroj umožňující vytvořit abstraktní vzor zvaný šablony (templates). Někdy hovoříme také o generických nebo parametrizovaných konstrukcích. Šablony jsou někdy označovány jako metatřídy. Teprve její "instancí" vzniká běžná třída.
template <class typ> class AA{ ....};
V lomených závorkách jsou formální parametry, které mohou být buď typové nebo hodnotové. S hodnotovými parametry se setkáváme u obyčejných funkcí (int, unsigned, atd; nelze použit objektové typy nebo pole). Můžeme u nich předepsat implicitní hodnoty. Naopak typové parametry jsou uvedeny klíčovým slovem class (v novějších překladačích je možné použít i typename) a specifikují datové typy.
Příklad šablony řadových funkcí (funkcí, které nejsou metodami tříd):
template <class typ> typ Maximum(typ a,typ b);
//deklarace
template <class typ> typ Maximum(typ a,typ b)
// nebo template <typename typ> typ Maximum(typ a,typ
b)
{
return (a<b)<b:a;
}
Je však potřeba si uvědomit, že při generování instance šablony se neprovádějí ani triviální konverze parametrů, to znamená,že s následujícím příkladem si naše šablona neporadí.
const int X=100;
char c = A;
int y = 25;
cout << Maximum(X,y); //chyba! V Borland C/C++ 3.1
pracuje!
cout << Maximum(c,y); //chyba!
Cout << Maximum((int)c,y); //správně
Příklad šablony řadových funkcí (funkcí, které nejsou metodami tříd):
template <class typ> typ Maximum(typ a,typ b);
//deklarace
template <class typ> typ Maximum(typ a,typ b)
// nebo template <typename typ> typ Maximum(typ a,typ
b)
{
return (a<b)<b:a;
}
Deklarace šablon objektového typu má tvar:
template <class typ> class AA;
template <class typ> class AA
{
typ h;
public:
AA(typ x);
typ DejA();
};
//definice metod šablony
template <class typ> AA<typ>::AA(typ x)
{
h=x;
}
template <class typ> typ AA<typ>::DejA()
{
return h;
}
int main()
{
AA<int> a(15); //instance šablony
cout << a.DejA();
return 0;
}
Autor: Filip Koval