Программирование >>  Программирование на языке c++ 

1 ... 79 80 81 [ 82 ] 83 84 85 ... 159


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 {..................... };

Рассмотрим примеры. Первый пример показывает, что аргументами шаблона могут быть только константные



1 ... 79 80 81 [ 82 ] 83 84 85 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика