ВУЗ:
Составители:
Рубрика:
Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
Заметим, что если функция 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
Страницы
- « первая
- ‹ предыдущая
- …
- 22
- 23
- 24
- 25
- 26
- …
- следующая ›
- последняя »
