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




Шаблоны функций и шаблонные функции - часть 5


#include <iostream.h> template <class Type> int neq (Type, Type); /*Прототип шаблона функции.*/ class ComplexType { public: double real; double imag; // Конструктор умолчания. ComplexType(double re = 0.0, double im = 0.0) {real = re; imag = im;} /* Операторная функция != . Без неё невозможно построение шаблонной функции neq() для комплексных чисел. */ int operator != (ComplexType &KeyVal) { if (real == KeyVal.real && imag == KeyVal.imag) return 0; else return 1; } }; void main () { // Определены и проинициализированы переменные трёх типов. int i = 1, j = 2; float k = 1.0, l = 2.0; ComplexType CTw1(1.0,1.0), CTw2(2.0,2.0); //На основе выражений вызова транслятор строит три шаблонных функции. cout << "neq() for int:" << neq(i,j) << endl; cout << "neq() for float:" << neq(k,l) << endl; cout << "neq() for ComplexType:" << neq(CTw2,CTw3) << endl; } /*Определение шаблона функции.*/ template <class Type> int neq (Type a, Type b) { return a != b ? 1 : 0; // return a != b; /* На самом деле, можно и так… */ }

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

#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; }




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