Классы-шаблоны полезны тогда, когда класс содержит логику, допускающую значительные обобщения.
Общая форма объявления класса-шаблона имеет следующий вид:
template <class параметр-тип> class имя_класса
{
. . . // тело класса
}
Где параметр-тип – это параметр-тип, который указывается при создании экземпляра класса.
После создания класса-шаблона можно создать конкретный экземпляр этого класса, используя следующую общую форму:
имя_класса <тип> объект;
Где тип – это имя типа данных, с которым будет оперировать данный класс.
Например, создадим класс-шаблон, реализующий стандартный стек "последним вошел– первым вышел". Он может использоваться для реализации стека с произвольным типом данных.
// демонстрация работы целого и вещественного стеков
a.push(1);
b.push(99.3);
a.push(2);
b.push(-12.23);
cout<<a.pop()<<" "<<a.pop()<<" ";
cout<<b.pop()<<" "<<b.pop()<<"\n";
//демонстрация работы символьного стека
for (i=0; i<10; i++) c.push((char) 'A'+i);
for (i=0; i<10; i++) cout<<c.pop();
cout<<"\n";
return 0;
}
Объявление класса-шаблона похоже на объявление функции-шаблона. При объявлении конкретного экземпляра созданного класса-шаблона (в данном примере stack) компилятор автоматически генерирует все необходимые функции и данные для обработки фактических данных.
Можно создать стек, содержащий определенный тип данных.
Например, можно хранить адреса, используя следующую структуру:
struct address
{
char name[40];
char street[40];
char city[30];
}
Затем можно использовать класс stack (из предыдущего примера) для создания стека, в котором хранятся объекты типа address:
stack<address> obj;
Класс-шаблон может иметь несколько типов-шаблонов, объявленных в виде списка, разделенного запятыми.
Например:
// в данном примере используется два шаблона при определении класса
#include <iostream.h>
#include <conio.h>
template <class Type1, class Type2> class myclass
{
Type1 i;
Type2 j;
public:
myclass(Type1 a, Type2 b)
{
i=a;
j=b;
}
void show()
{
cout<<i<<" "<<j<<"\n";
}
};
int main()
{
clrscr();
myclass<int, double> ob1(10, 0.25);
myclass<char, char *> ob2('X', "Это – тест");
ob1.show(); // вывод int и double
ob2.show(); // вывод char и char *
return 0;
}
В программе объявляются два типа объектов ob1 и ob2.
Объект ob1 использует типы данных int и double, объект ob2 – char и char *.
В обоих случаях компилятор автоматически генерирует необходимые данные и функции в соответствии с типом данных, которые передаются конструктору в качестве аргументов.