Шаблонные классы

В языке C++ помимо шаблонных функций можно применять шаблонные (обобщенные) классы, реализующие одинаковый алгоритм работы, но использующие разные типы данных, которые указываются при создании объекта. Компилятор на основе шаблонного класса автоматически создаст перегруженные версии в зависимости от имеющихся способов создания объектов в программе.

Создание шаблонного класса

Описывается шаблонный класс по следующей схеме:

template<typename Тип1[, ..., typename ТипN]>
class Название_класса {
   // Тело класса
};

После ключевого слова template внутри угловых скобок через запятую указываются обобщенные названия типов. Эти названия используются для описания типов, которые могут использоваться внутри класса. При компиляции обобщенные типы будут заменены реальными типами данных. Перед названием обобщенного типа могут быть указаны ключевые слова class или typename, которые обозначают одно и то же.

Внутри объявления шаблонного класса не нужно использовать ключевое слово template для объявления шаблонного метода, так как методы шаблонного класса автоматически становятся шаблонными. Однако перед определением шаблонного метода вне класса необходимо указать ключевое слово template с такими же типами, что и в объявлении шаблонного класса. Схема определения шаблонного метода вне объявления класса выглядит так:

template<typename Тип1[, ..., typename ТипN]>
Тип_результата Название_класса<Тип1[, ..., ТипN]>::Название_метода(
         [Тип Название_параметра1[, ..., Тип Название_параметраN]])
{
   // Тело метода
}

Для создания экземпляра шаблонного класса используется следующий синтаксис:

Название_класса<Тип1[, ..., ТипN]> Название_переменной;
Название_класса<Тип1[, ..., ТипN]> Название_переменной(Значение1
                                              [, ..., ЗначениеN]);

Обратите внимание на то, что при создании объекта внутри угловых скобок указываются реальные типы данных, а не обобщенные. В качестве примера создадим шаблонный класс и объявим несколько объектов с разными типами данных (листинг 15.1).

Листинг 15.1. Шаблонные классы

#include <iostream>

template<typename T1, typename T2>
class C {
   T1 x_;
   T2 y_;
public:
   C(T1 x, T2 y);
   void print();
   T1 sum();
};

int main() {
   C<int, int> a(10, 20);
   a.print();
   std::cout << "sum = " << a.sum() << std::endl;
   C<double, int> b(54.6, 63);
   b.print();
   std::cout << "sum = " << b.sum() << std::endl;
   C<double, double> c(14.8, 47.8);
   c.print();
   std::cout << "sum = " << c.sum() << std::endl;
   return 0;
}

template<typename T1, typename T2>
C<T1, T2>::C(T1 x, T2 y) {
   x_ = x; y_ = y;
}
template<typename T1, typename T2>
void C<T1, T2>::print() {
   std::cout << "x_ = " << x_ << " y_ = " << y_ << std::endl;
}
template<typename T1, typename T2>
T1 C<T1, T2>::sum() {
   return x_ + y_;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов