C++.Бархатный путь




Шаблоны функций и шаблонные функции


Рассмотрим простую функцию, реализующую алгоритм сравнения двух величин:

int min (int iVal_1, int iVal_2) { return iVal_1 < iVal_2 ? iVal_1 : iVal_2; /* Возвращается значение iVal_1, если это значение меньше iVal_2. В противном случае возвращается значение iVal_2. */ }

Для каждого типа сравниваемых величин должен быть определён собственный вариант функции min(). Вот как эта функция выглядит для float:

float min (float fVal_1, float fVal_2) { return fVal_1 < fVal_2 ? fVal_1 : fVal_2; }

А для double… А для…

И так для всех используемых в программе типов сравниваемых величин. Мы можем бесконечно упражняться в создании совместно используемых функций, хотя можно воспользоваться средствами препроцессирования: #define min(a,b) ((a)<(b)?(a):(b))

Это определение правильно работает в простых случаях:

min(10, 20); min(10.0, 20.0);

В более сложных случаях могут получаться неожиданные результаты, о которых уже когда-то давно мы говорили… Это происходит из-за того, что препроцессор действует независимо от компилятора, до компилятора и вообще производит лишь простую текстовую обработку исходного модуля.

C++ предоставляет ещё одно средство для решения этой задачи. При этом сохраняется присущая макроопределениям краткость и строгость контроля типов языка. Этим средством является шаблон функции.

Шаблон функции позволяет определять семейство функций. Это семейство характеризуется общим алгоритмом, который может применяться к данным различных типов. При этом задание конкретного типа данных для очередного варианта функции обеспечивается специальной синтаксической конструкцией, называемой списком параметров шаблона функции. Объявление функции, которому предшествует список параметров шаблона, называется шаблоном функции.

Синтаксис объявления шаблона определяется следующим множеством предложений Бэкуса-Наура:

Объявление ::= ОбъявлениеШаблона

ОбъявлениеШаблона ::= template <СписокПараметровШаблона> Объявление

СписокПараметровШаблона ::= ПараметрШаблона

::= СписокПараметровШаблона, ПараметрШаблона




Содержание  Назад  Вперед