Шаблонные классы. Явные специализации шаблонных классов.


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; просмотров: 279;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.