Шаблоны классов
Перед шаблоном класса необходимо написать:
template <параметры шаблона>
Методы шаблонного класса должны быть определены в заголовочном файле либо в объявлении класса (тогда они являются встраиваемыми), либо как шаблонные функции.
Пример шаблона класса:
template <typename T=int, int size=100>
class Stack {
T s[size];
int t;
public:
Stack():t(-1) {} //
bool isEmpty()const { return t==-1; }
bool isFull()const { return t==size-1; }
void pop();
const T & top()const;
void push(const T &);
};
class StackEmpty {}; //
class StackFull {};
template <typename T, int size>
void Stack<T,size>::pop()
{ if(!isEmpty())
--t;
}
template <typename T, int size>
const T & Stack<T,size>::top()const
{ if(isEmpty())
throw StackEmpty();
return s[t];
}
template <typename T, int size>
void Stack<T,size>::push(const T& v)
{ if(isFull())
throw StackFull(); //
s[++t]=v;
}
При создании объектов шаблонного класса после имени класса в
<> указываем аргументы шаблона:
Stack<int,200> a; //
Stack<double> b; //
Stack<> c; //
В C++17 можно не указывать параметры шаблона класса при создании объекта явно, если компилятор может их определить по параметрам конструктора (как это было сделано для шаблонов функций):
vector<double> v1; //
vector v2{1,2,3}; //
vector v3; //
auto fun() {
return vector{1,2,3}; //
}