Russian Belarusian English German Japanese Ukrainian

2.335

Перегруженные функции обычно используются для выполнения сходных операций над различными типами данных. Если операции идентичны для каждого типа, это можно выполнить более компактно и удобно, используя шаблоны функций. Достаточно написать одно единственное определение шаблона функции. Основываясь на типах аргументов, указанных в вызовах этой функции, С++ автоматически генерирует разные функции для соответствующей обработки каждого типа. Таким образом, определение единственного шаблона определяет целое семейство решений.

Все определения шаблонов функций начинаются с ключевого слова template, за которым следует список формальных типов параметров функции, заключенный в угловые скобки (<) и (>). Каждый формальный тип параметра предваряется ключевым словом class. Формальные типы параметров - это встроенные типы или типы, определяемые, пользователем. Они используются для задания типов аргументов функции, для задания типов возвращаемого значения функции и для объявления переменных внутри тела описания функции. После шаблона следует обычное описание функции.

Приведем пример шаблона функции, возвращающей минимальный из трех передаваемых в нее параметров любого (но одинакового) типа:

template <class T>
T min(T x1, T x2, T x3)
{
T lmin = x1;
if (x2 < lmin)
lmin = x2;
if (x3 < lmin)
lmin = x3;
return lmin;
}

В заголовке шаблона этой функции объявляет единственный формальный параметр T как тип данных, который должен проверяться функцией min. В следующем далее заголовке функции этот параметр T использован для задания типа возвращаемого значения (T min) и для задания типов всех трех параметров x1 - xЗ. В теле функции этот же параметр T использован для указания типа локальной переменной lmin.

Объявленный таким образом шаблон можно использовать, например, следующим образом:

int i1 = 1, i2 = 3 , i3 = 2;
double r1 = 2.5, r2 = 1.7, r3 = 3.4;
AnsiString s1 = "строка 1", s2 = "строка 2", s3 = "строка 3";
Label1->Caption = min(i1,i2,i3);
Label2->Caption = min(r1,r2,r3);
Label3->Caption = min(s3,s2,s1);

Когда компилятор обнаруживает вызов min в исходном коде программы, этот тип данных, переданных в min, подставляется всюду вместо T в определении шаблона и С++ создает законченную функцию для определения максимального из трех значений указанного типа данных. Затем эта созданная функция компилируется. Таким образом, шаблоны играют роль средств генерации кода.

Например, при вызове функции с тремя целыми параметрами компилятор сгенерирует функцию:

int min(int x1, int x2, int x3)
{
int lmin = x1;
if (x2 < lmin)
lmin = x2;
if (x3 < lmin)
lmin = x3;
return lmin;
}

Приведенный шаблон будет работать для любых предопределенных или введенных пользователем типов, для которых определена операция отношения (<).

Каждый формальный параметр в определении шаблона должен хотя бы однажды появиться в списке параметров функции. Каждое имя формального параметра в списке определения шаблона должно быть уникальным. Отсутствие ключевого слова class перед каждым формальным параметрам шаблона функции является ошибкой.

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


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