Шаблонные классы. Явные специализации шаблонных классов.
template <class Ттип1, class Ттип2, … >
тип имя_класса
{
…
};
имя_класса <тип1, тип2, … >
Шаблонный класс определяет класс, в котором некоторые типы данных задаются параметрами шаблона. Особенности:
· Используется для реализации объектов, в которых логика работы не зависит от типа данных (например, универсальных контейнеров (массивы, стеки, очереди и т.д.)
· Позволяет создать в программе код, который легче поддерживать, чем множество версий одного и того же класса, реализованных для разных типов данных
· Конкретный экземпляр объекта типа шаблонного класса создается компилятором и требует обязательного указания конкретных типов параметров шаблона
· Для задания типа данных используется ключевое слово class или typename
· Ттип – тип данных, в списке параметров шаблона (при создании конкретного экземпляра класса требуется задать фактический тип, число параметров должно отвечать требованиям класса)
· Тип – фактический тип данных, которыми оперирует экземпляр класса (типы разных параметров могут совпадать)
· Встроенные функции-члены шаблонного класса автоматически становятся шаблонными
· Можно создавать столько различных видов экземпляров шаблонного класса, сколько существует используемых типов данных и их способов задания в списке параметров шаблона
Можно создавать явные специализации шаблонных классов. Для создания специализвцияя явно указывается тип:
template < > class имя_класса <явный_тип> {…}
специализация расширяет возможности шаблонных классов, т.к. позволяет обрабатывать отдельные особые ситуации. Но если требуется создание большого количества специализаций, то от создания шаблонного класса следует отказаться
Шаблонный класс:
template <class Type>
class stack
{
private:
int top;
Type s[10];
public:
stack (): top(0) {}
void push(Type var)
{
top++;
s[top] = var;
}
Type pop()
{
Type var = s[top];
top--;
return var;
}
};
Явная специализация:
template <class T> class cobject
{
T x;
public:
cobject(T a) { cout << "template class\n"; x = a; }
T getx() {return x;}
};
template <> class cobject<int>
{
int x;
public:
cobject(int a) { cout << "int specialization\n";
if (a > 0) x = a; else x = -a; }
int getx() {return x;}
};
void main()
{
cobject<double> o1(-1.5);
cout << o1.getx() << "\n";
cobject<char> o2('z');
cout << o2.getx() << "\n";
cobject<int> o3(-2);
cout << o3.getx() << "\n";
}
Дата добавления: 2022-02-05; просмотров: 269;