Шаблоны (template)
Шаблоны позволяют писать уже знакомые языковые конструкции -
функции и классы с используемыми в них типами, задаваемыми параметрами.
Например, класс комплексных чисел может быть определен как для
сотавляющих типа 'double', так и для 'float' и даже 'int'. Без шаблонов пришлось
бы писать три одинаковых класса. Шаблоны позволяют отвлечься от
особенностей типов и написать класс, использующий некий неопределенный
тип 'T', который в дальнейшем примет значения 'double', 'float' и 'int'.
Шаблонизация производится с помощью ключевого слова 'template'. Языком
поддерживаются шаблоны классов и шаблоны функций.
Шаблоны классов (class templates)
Шаблоны класов позволяют создавать классы C++ с типами и значениями
в качестве параметров объявления класса.
// объявление шаблона класса
template
Т> // можно также написать 'template ' -
//
варианты идентичны
class Complex
{
T re, im;
86
public:
Complex();
Complex(T re, T im);
};
// определение конструктора по умолчанию
template
Т>
Complex::Complex(): re{0},im{0}
{
}
// определение конструктора инициализации
template
Т>
Complex::Complex(T r, T i): re{r},im{i}
{
}
// создание объекта на основе шаблона класса
Complex x;
Complex y;
Complex z(1,1);
Шаблон раскрывается компилятором C++ в обычный класс с
подстановкой вместо формального параметра-типа факического типа,
указанного при инстанциировании. В коде из примера выше будут созданы три
класса по одному для каждого из параметров 'double', 'float', 'int'. Например, для
'double'
будет создан такой класс:
class Complex
{
double re, im;
public:
Complex();
Complex(double re, double im);
};
Определение методов аналогично тому, как они определяются в обычных
классах можно дать при объявлении класса либо в файле реализации указав что
метод принадлежит шаблону класса.
// Определение внутри класса
template
Т>
class Complex
{
...
Complex(double re, double im): this->re{re}, this->im{im}
{
...
}
87
...
};
// Определение вне класса. Необходимо отдельно указать
//
что это метод класса-шаблона
template
Т>
Complex::Complex(double re, double im): this->re{re}, this->im{im}
{
...
}
В шаблоне можно задать число параметров больше одного или их
переменное число (0 или больше). Можно комбинировать определенные
параметры и переменные.
template
Т, typename U> // два параметра - два типа, которые при
//
инстанциировании получат
//
собственные значения
class A;
A x;
// инстанциирование шаблона с двумя параметрами
template
Т, typename ...U> // один обязательный параметр и
//
переменное число параметров.
class B;
B y;
// инстанцирование шаблона с переменным числом параметров.
//
Здесь после int могут быть перечислены один или более
//
параметров
Кроме типов параметрами шаблона могут выступать значения.
Аналогично функциям параметры шаблонов могут иметь значения по
умолчанию.
template
// Шаблон с параметрами
//
по умолчанию
class D;
// Возможные варианты инстанциирования такого шаблона
D x;
D y;
D z;
// в качестве параметров указаны и типы и
//
значение параметра
Do'stlaringiz bilan baham: |