Шаблоны классов
Параметры шаблона
При описании шаблона можно задать более одного параметра. Например:
template <class T, int size=256> class Stack {…};
Теперь при создании конкретной реализации класса можно задать размер стека:
Stack <int, 2048>;
…или:
Stack <double, 8*N>;
Важно запомнить, что числовой параметр должен быть константой. В примере переменная N могла быть описана как const int N=1024; но не могла быть переменной int N=1024;. При создании конкретного класса по шаблону возможно вложенное определение класса, например, если был описан частный случай класса – шаблон структур вида:
template <class T> struct Buffer {…};
То после этого можно создать конкретную структуру, в качестве типа которой задать структуру, созданную по этому же шаблону, например:
Buffer <Buffer <int> > buf;
Между двумя закрывающими угловыми скобками " надо вставить символ пробела, так как в языке C++ операция >> имеет самостоятельный смысл, и не один. Существует возможность генерировать по шаблону классы, которые являются производными от какого-то базового класса. Например, если описать базовый класс TList, в котором не определен тип элементов хранения, то есть используется тип void, то целесообразно ввести описание шаблона производных классов:
class TList //======== Начало списка void *First;: public: void insert (void*); int order (void*, void*, int); //======== Другие методы }; template <class T> class List: public TList T *First; public: void insert (T *t) { TList::insert(t); } int order (T *pl, T *p2, int n) { return TList::order(pi, p2, n); } //======= Другие методы };
В этих условиях становится возможным декларация списка, состоящего из элементов одного определенного типа, например List <int> intList;, или гетерогенного списка, состоящего из элементов различных типов, образованных от какого-то одного базового класса. Например, объявление List <Device> DevList; генерирует класс для работы со списком приборов, из иерархии классов Device, то есть в списке могут быть объекты классов, производных от Device. Аналогичный результат даст объявление List <Man> ManList; и т. д. Вспомните, что работать с объектами производных классов можно с помощью указателей на базовый класс.