sp-dd1-part2 (1119737), страница 7
Текст из файла (страница 7)
Шаблоны классов.
Шаблоны классов тоже зачастую бывают разумными. Как правило, они применяются при описании контейнеров, то есть типов, которые содержат в себе каким-то образом структурированные об’екты других типов. Например, стек можно реализовать как контейнер. Операции над ним, вообще говоря, не зависят от типа его элементов.
Пример. Контейнер-вектор.
template<class T> class Vector {
T *p;
int size;
public: explicit Vector (int);
T& operator[] (int i);
};
Vector<int> x(20); // вектор из 20 целых чисел
Vector<Complex> y(100); // вектор из 20 комплексных чисел
Инстанцирование – процесс генерации класса по шаблону.
Любая функция из шаблонного класса является шаблонной, так что описывать функции вне класса нужно так:
template<class T> T& Vector<T>::operator[] (int i) { ... }
Пример. Класс с нетиповым параметром.
template<class T, int size> class buffer { ... }
buffer <char,1024> x;
buffer <char,512*2> y;
buffer <int,1024> z;
Возникает вопрос, какие переменные будут иметь одинаковые типы? Есть общее правило: инстанцированные классы будут считаться одинаковыми, если типовые параметры совпадают, а нетиповые равны по значению. x и z, очевидно, разного типа, так как типовые параметры не совпадают. Для нетиповых параметров должна быть определена операция сравнения на равенство. Получается, что параметры шаблона не могут быть вещественными. Еще одно замечание: нетиповые параметры могут быть только у шаблонов классов, но не у шаблонов функций (так сказала ТВ; но как быть со вставкой выше?).
/* на этом изложение теории языка C++ считается законченным. На лекциях ещё будет рассказ о STL, но это хз когда. */
Удачи всем в субботу! ;)















