|
Программирование >> Программирование на языке c++
cout << f(c1,i1) << endl; Правило 3. Результат: 5 cout f(i1,c2) endl; Правило 3. Результат: 9 Последняя программа показывает передачу в функцию нескольких типов и иллюстрирует получение разных результатов при изменении последовательности записи значений аргументов разных типов. #lnclude <lostream.h> template<class Т1,class T2,class Т3> Т1 f(T1 х,Т2 у,ТЗ z) { return x-l-y-l-z; } void main(void) { Bee три следуюидих результата являются разными cout f(1,r,1.1) endl; Результат: 51 cout f(r,1,1.1) endl; Результат: 3 cout f(1.1,1,r) endl; Результат: 51.1 так можно привести возвращаемое значение к единому типу cout (char)f(1,r,1.1) endl; Результат: 3 cout {char)f{1M,1.1) endl; Результат: 3 cout (char)f(1.1,1,r) endl; Результат: 3 так можно привести аргументы и возвращаемое значение к типу int int f(int,int,int); cout f(i;i,1.1) endl; Результат: 51 cout f{1,1,1.1) endl; Результат: 51 cout f(1.1,1,1) endl; Результат: 51 Здесь можно также явно указать возвращаемый функцией f тип в самом шаблоне, например, template<class T1,class T2,class Т3> char f(T1 х,Т2 у,ТЗ z) Однако в этом случае объявление int f(int,int,int), сделанное в программе, будет давать ошибку, так как соответствующая функция теперь не может быть сгенерирована по шаблону. Это объявление следует удалить. 6.5. Передача дополнительных аргументов в шаблоны Аргументами шаблона могут быть не только типы, но и константные выражения (в работе [1, с. 279] сказано, что аргументами могут быть переменные, функции и константные выражения, однако многие компиляторы поддерживают только константные выражения). Рассмотрим пример: #include <iostream,h> #include <string.h> template<class Type,int size> class array { Type contents[size]; public: Type& operator[](int x) { if ((x<0)(x>=size)) { cerr range error\n ; x=0; } return contents[x]; } void main(void) { array<char,10> my array; for (int j=0;j<12;j-l-l-) cin my array[j]; for(j=0;j<12;j+-h) cout my array[j] \t; cout endl; } Здесь в выражении template<class Type,int size> мы указали тип Type и размер size для нашего массива array. В результате размер массива известен на этапе компиляции программы и отпадает необходимость в динамическом выделении памяти на этапе выполнения программы. Предположим, мы хотим объявить объекты некоторых классов, заданных с помощью шаблона. В этом случае два объекта можно считать объектами одного и того же класса, если они имеют один и тот же шаблон класса и аргументы этого шаблона имеют одни и те же значения. Рассмотрим пример: template<class Type,int size> class array { Type contents[size]; void main(void) { array<char,10> my array1; array<char,20> my array2; array<char,10> my array3; array<int,20> my array4; my array2=my array1; ошибка my array3=my array1; нет ошибки my array4=my array2; ошибка ..................... } Рассмотрим строку my array4=my array2; Здесь соответствующие объекты имели описания: array<int,20> my array4; array<char,20> my array2; Значения вторых аргументов шаблона совпадают. Не совпадают только типы первых аргументов, но по соглашению, принятому в языках C/C++, тип char может быть автоматически преобразован в тип int. Однако все эти соглашения не распространяются на шаблоны. Поэтому приведенная выше строка является ошибочной. Таким образом, два разных типа, сгенерированных из одного и того же шаблона, всегда будут разными независимо от возможных автоматических преобразований, принятых в языке С++. В заключение укажем, что аргументами шаблона могут быть только переменные, например: template<int a,char b> class my class { ..................... }; Некоторые компиляторы позволяют задавать в шаблоне значения соответствующих констант: template<int a,char b=W> class my class {..................... }; Рассмотрим примеры. Первый пример показывает, что аргументами шаблона могут быть только константные
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |