Объектно-ориентированное программирование на C++. Андрианова А.А - 24 стр.

UptoLike

Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
Заметим, что если функция Swap() будет вызвана с параметрами
различных типов данных, компилятор на основе шаблона не сможет
сгенерировать функцию, поскольку согласно определению шаблона
параметры должны иметь одинаковый тип.
На практике могут возникнуть ситуации, когда один и тот же
алгоритм нельзя использовать для всех типов данных. Тогда можно
использовать перегрузку определений шаблонов функции, т.е. создать
два и более шаблона, либо создать функции для конкретных типов
данных. Например, предыдущий шаблон функции Swap() для двух
массивов неприменим, поскольку необходимо дополнительно передавать
в качестве параметров количество элементов в массивах. Поэтому шаблон
можно перегрузить следующим образом:
// шаблон функции обмена значениями двух массивов
// с элементами типа Т
template <class T> void Swap(T*& a, int& m, T*& b, int& n)
{
int t = n; n = m; m = t;
T* ta = a; a = b; b = ta;
}
Приведем еще один пример, в котором используется несколько
обобщенных типов. Пусть требуется написать шаблон функции
умножения вектора с элементами произвольного типа на число (целое или
вещественное, дробь, комплексное число). Тип элементов вектора-
результата зависит от типа элементов исходного вектора и от типа числа,
на которое он умножается. Поэтому внутри шаблона функции тип
результата определить сложно. Для этого лучше создать еще один
обобщенный тип:
// шаблон функции умножения вектора на число
template <class T1, class T2, class T3>
T3* multiply (T1* obj, int n, T2 number)
{
T3* res;
res = new T3[n];
for(int i = 0; i < n; i++)
res[i] = (T3) obj[i] * number;
return res;
}
24
                                Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
     Заметим, что если функция Swap() будет вызвана с параметрами
различных типов данных, компилятор на основе шаблона не сможет
сгенерировать функцию, поскольку согласно определению шаблона
параметры должны иметь одинаковый тип.
     На практике могут возникнуть ситуации, когда один и тот же
алгоритм нельзя использовать для всех типов данных. Тогда можно
использовать перегрузку определений шаблонов функции, т.е. создать
два и более шаблона, либо создать функции для конкретных типов
данных. Например, предыдущий шаблон функции Swap() для двух
массивов неприменим, поскольку необходимо дополнительно передавать
в качестве параметров количество элементов в массивах. Поэтому шаблон
можно перегрузить следующим образом:

     // шаблон функции обмена значениями двух массивов
     // с элементами типа Т
     template  void Swap(T*& a, int& m, T*& b, int& n)
     {
          int t = n; n = m; m = t;
          T* ta = a; a = b; b = ta;
     }

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

     // шаблон функции умножения вектора на число
     template 
     T3* multiply (T1* obj, int n, T2 number)
     {
          T3* res;
          res = new T3[n];
          for(int i = 0; i < n; i++)
               res[i] = (T3) obj[i] * number;
          return res;
     }




24