Шаблон класса имеет вид:
template <список параметров> class объявление_класса
Список параметров класса-шаблона аналогичен списку параметров функции-шаблона: список классов и переменных, которые подставляются в объявление класса при генерации конкретного класса.
Очень часто шаблоны используются для создания коллекций, т.е. классов, которые представляют собой набор объектов одного и того же типа. Простейшим примером коллекции может служить массив. Массив, несомненно, очень удобная структура данных, однако у него имеется ряд существенных недостатков, к которым, например, относятся необходимость задавать размер массива при его определении и отсутствие контроля использования значений индексов при обращении к атрибутам массива.
Попробуем при помощи шаблонов устранить два отмеченных недостатка у одномерного массива. При этом по возможности попытаемся сохранить синтаксис обращения к атрибутам массива. Назовем новую структуру данных вектор vector.
template <class T> class vector { public: vector() : nItem(0), items(0) {}; ~vector() { delete items; }; void insert(const T& t) { T* tmp = items; items = new T[nItem + 1]; memcpy(items, tmp, sizeof(T)* nItem); items[++nItem] = t; delete tmp; } void remove(void) { T* tmp = items; items = new T[--nItem]; memcpy(items, tmp, sizeof(T) * nItem); delete tmp; } const T& operator[](int index) const { if ((index < 0) || (index >= nItem)) throw IndexOutOfRange; return items[index]; } T& operator[](int index) { if ((index < 0) || (index >= nItem)) throw IndexOutOfRange; return items[index]; } private: T* items; int nItem; };
Кроме конструктора и деструктора, у нашего вектора есть только три метода: метод insert добавляет в конец вектора новый элемент, увеличивая длину вектора на единицу, метод remove удаляет последний элемент вектора, уменьшая его длину на единицу, и операция [] обращается к n-ому элементу вектора.
vector<int> IntVector; IntVector.insert(2); IntVector.insert(3); IntVector.insert(25); // получили вектор из трех атрибутов: // 2, 3 и 25 // переменная x получает значение 3 int x = IntVector[1]; // произойдет исключительная ситуация int y = IntVector[4]; // изменить значение второго атрибута вектора. IntVector[1] = 5;