Страница 41 из 48 И ещё один пример. Этот пример подтверждает обязательность включения всех параметров шаблона в список параметров шаблона определяемой функции. Независимо от того, какая роль предназначается шаблонному параметру (он вообще может не использоваться в шаблонной функции), его присутствие в списке параметров обязательно. В процессе построения шаблонной функции транслятор модифицирует весь шаблон полностью - его заголовок и его тело. Так что в теле шаблона можно объявлять переменные, специфицированные параметрами шаблона. #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; } |