Шаблонные классы

 Шаблоны (templates) - очень мощное средство. Шаблонные функции и классы позволяют очень сильно упростить программисту жизнь и сберечь огромное количество времени, сил и нервов.
    В общем-то шаблонные классы создаются почти так же как и шаблонные функции - перед именем класса записывается ключевое слово template. Шаблонные классы рассмотрим на примере стека:

 template <class Type>
class stack
{
private:
int top;
Type s[10];
 
public:
stack (): top(0)
{}
 
void push(Type var)
{
top++;
s[top] = var;
}
 
Type pop();
};
 
template <class Type>
Type stack::pop()
{
Type var = s[top];
top--;
return var;
}
Здесь мы определили стек из десяти элементов. Эти элементы могут быть какого угодно типа, об этом чуть-чуть ниже.

Единственное на что хочу обратить ваше внимание: определение функций push и pop. Функция push определена внутри класса, а функция pop - снаружи. Для всех функции объявленных за пределами класса, нужно обязательно указывать ключевое слово template. Выражение перед именем функции совпадает с тем, которое указывается перед именем класса.


 Теперь посмотрим как работать с шаблонными классами:

    
stack<int> s1;
stack<float> s2;
 
s1.push(3);
s1.push(2);
s1.pop();
 
s2.push(0.5);

При создании объекта, после имени класса нужно поставить угловые скобки, в которых указать нужный тип. После этого объекты используются так, как мы привыкли.


У шаблонных классов есть одна потрясающая особенность - кроме стандартных типов, они могут работать и с пользовательскими. Рассмотрим небольшой пример. Для этого определим простой класс warrior:

class warrior
{
public:
int health;
warrior () : health(0) {}
};
 
stack<warrior> s;
 
warrior w1;
warrior w2;
warrior w3;
 
s.push(w1);
s.push(w3);
 
s.pop();
s.push(w2);

Comments