Объектно-ориентированное программирование на C++


Отождествление типов аргументов


Так как компилятор генерирует экземпляры шаблонов функций согласно типам, заданным при их вызовах, то критическим моментом является передача корректных типов, особенно если шаблон функции имеет два или более параметров. Хорошим примером является классическая функция max():

template <class T>

T max (T a, T b)

{

return a > b ? a : b;

}

Функция max() будет работать правильно, если оба ее аргумента имеют один и тот же тип:

int i = max (1, 2);

double d = max (1.2, 3.4);

Однако, если аргументы различных типов, то вызов max() приведет к ошибке, так как компилятор не сможет понять, что ему делать.

Один из возможных способов для разрешения неоднозначности состоит в использовании приведения типов, чтобы прояснить наши намерения:

int i = max ((int)'a', 100);

Вторая возможность - это явно объявить версию экземпляра шаблона функции перед ее вызовом:

int max (int, int);

int j = max ('a', 100);

Третий способ решить проблему состоит в создании шаблона функций, который имеет параметры различных типов.

template <class T1, class T2>

T1 max (T1 a, T2 b)

{

 return a > (T1)b ? a : (T1)b;

}

Использование этой новой версии max() не приведет к неоднозначности в случае использования двух различных типов. Например, если написать
max ('a', 100);


то компилятор будет использовать два заданных (посредством аргументов типа) и построит версию функции max() с заголовком
char max (char, int);

Далее компилятор перед выполнением сравнение приведет тип второго аргумента к типу первого аргумента. Такой способ допустим, однако использование двух типовых параметров в шаблоне функции, которая должна была бы работать только с одним типом, часто лишь затрудняет жизнь. Довольно тяжело помнить, что
max ('a', 100)


дает значение типа char, в то время как
max (100, 'a')


передает в вызывающую программу int.



Содержание раздела