C++. Бархатный путь. Часть 2
Страница 41. Шаблоны функций и шаблонные функции. Часть 3


 

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

#include <iostream.h>
#include <typeinfo.h>
/*
В программе используется объект класса Type_info, позволяющий
получать информацию о типе. Здесь подключается заголовочный файл,
содержащий объявление этого класса
*/
template <class YYY, class ZZZ> YYY Tf (ZZZ, YYY, int);
/*
Шаблон прототипа функции. Функция Tf возвращает значение пока
ещё неопределённого типа, обозначенного параметром шаблона YYY.
Список её параметров представлен двумя (всеми!) параметрами шаблона
и одним параметром типа int.
*/
void main()
{
cout << Tf((int) 0, '1', 10) << endl;
/*
Собственно эти вызовы и управляют работой транслятора. Тип передаваемых
значений параметров предопределяет структуру шаблонной функции.
В первом случае шаблону параметра ZZZ присваивается значение "int",
шаблону параметра YYY присваивается значение "char", после чего прототип
шаблонной функции принимает вид
char Tf (int, char, int);
*/
cout << Tf((float) 0, "This is the string...", 10) << endl;
/*
Во втором случае шаблону параметра ZZZ присваивается значение
"float", шаблону параметра YYY присваивается значение "char *",
после чего прототип шаблонной функции принимает вид
char* Tf (float, char *, int);
В результате, используя один общий шаблон, мы получаем две совершенно
различных совместно используемых функции.
*/
}
/*
Шаблон функции. Первый параметр не используется, поэтому в списке
параметров он представлен спецификатором объявления. Второй шаблонный
параметр определён и также зависит от шаблона, третий параметр от
шаблона не зависит.
*/
template <class YYY, class ZZZ> YYY Tf (ZZZ, YYY yyyVal, int x)
{
ZZZ zzzVal;
int i;
for (i = 0; i < x; i++)
{
cout << "Tf() for " << typeid(zzzVal).name() << endl;
}
return yyyVal;
}

 
Следующая статья »