Скачиваний:
46
Добавлен:
15.09.2014
Размер:
877.06 Кб
Скачать

686 Глава 12

Все описания шаблонов функций начинаются с ключевого слова template, за которым следует список формальных параметров шаблона, заключаемый в угловые скобки (< и >); каждому формальному параметру должно пред­шествовать ключевое слово class, как в следующих примерах:

template <class T>

ИЛИ

template <class ElementType>

или

template <class BorderType, class FillType>

Формальные параметры в описании шаблона используются (наряду с параметрами встроенных типов или типов, определяемых пользователем) для определения типов параметров функции, типа возвращаемого функцией зна­чения и типов переменных, объявляемых внутри функции. Далее, за этим заголовком, следует обычное описание функции. Заметьте, что ключевое слово class, используемое в шаблоне функции при задании типов параметров, фактически означает «любой встроенный тип или тип, определяемый поль­зователем».

Типичная ошибка программирования 12.1

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

Давайте рассмотрим в качестве примера шаблон функции printArray, приведенный на рис. 12.1. Этот шаблон используется в программе, приве­денной на рис. 12.2.

В шаблоне функции printArray объявляется один формальный пара­метр Т (вместо идентификатора Т может быть использован любой другой допустимый идентификатор) для типа массива, который будет выводиться функцией printArray;

template<class T>

void printArray(T *array, const int count)

{

for (int i = 0; i < count; i++) cout « array[i] « " ";

cout « endl;

Рис. 12.1. Шаблон функции

Т называется параметром типа. Когда компилятор обнаруживает в текс­те программы вызов функции printArray, он заменяет Т во всей области определения шаблона на тип первого параметра функции printArray и С++ создает шаблонную функцию вывода массива указанного типа данных. После этого вновь созданная функция компилируется. В программе, приведенной на рис. 12.2, производится вызов трех функций printArray: одна выводит

Шаблоны _ 687

массив типа int, другая выводит массив чисел с плавающей запятой и третья обрабатывает массив символов. Например, реализация функции для типа int будет выглядеть следующим образом:

void printArray(int *array, const int count) {

for (int i = 0; i < count; i++) cout « array[i] « " ";

cout « endl;

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

Типичная ошибка программирования 12.2

Ошибка возникает, когда в списке параметров функции используются не все фор­мальные параметры шаблона функции.

На рис. 12.2 приведена программа, использующая шаблон функции prin-tArray. Программа начинается с определения массива а типа int, массива b типа float и массива с типа char с размерами соответственно 5, 7 и 6. Затем каждый из массивов выводится на экран при помощи вызова функции prin-tArray: один раз с первым аргументом равным а типа int *, затем с аргу­ментом b типа float * и в третьем вызове в качестве первого аргумента используется массив с типа char *. В результате вызова

printArray (а, aCount);

компилятор создает шаблонную функцию printArray, в которой вместо пара­метра типа Т используется тип int. Вызов функции

printArray (b, bCount);

приводит к созданию второй шаблонной функции printArray, в которой параметр типа Т заменяется на тип float. При обработке вызова функции

printArray (с, cCount);

компилятор создает третью шаблонную функцию printArray, для которой параметр типа Т заменяется на тип char.

Совет по повышению эффективности 12.1

Шаблоны несомненно расширяют возможности многократного использования про­граммного кода. Но имейте в виду, что программа может создавать слишком много копий шаблонных функций и шаблонных классов. Для этих копий могут потребо­ваться значительные ресурсы памяти.

688