printШаблоны

printШаблоны классов

Перед шаблоном класса необходимо написать:
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; // стек целых чисел размером 200
Stack<double> b;  // стек вещественных чисел размером 100
Stack<> c;        // стек целых чисел размером 100, <> обязательны

В C++17 можно не указывать параметры шаблона класса при создании объекта явно, если компилятор может их определить по параметрам конструктора (как это было сделано для шаблонов функций):
vector<double> v1; //OK, указано явно
vector v2{1,2,3}; //OK, vector<int>
vector v3; // Error, нельзя определить тип параметра
auto fun() {
  return vector{1,2,3}; // 
}
loading