<список_фактических_параметров_шаблона>
(список_фактических_параметров_шаблонной_функции);
Рассмотрим программу с примерами разных обращений к шаблонным функциям:
// Листинг 10.2
#include <iostream>
using namespace std;
// Шаблон функции, вычисляющей абсолютное значение
// числовых величин разных типов
template <typename type>
type abs(type x) {
return x > 0? x: -x;
}
// Шаблон функции суммирования элементов массива
template <typename T, typename RT>
RT sum(T* begin,T* end) {
T *p;
RT s = RT();
for (p = begin; p!= end; ++p)
s += *p;
return s;
}
// Примеры обращений к шаблонной функции
int main() {
setlocale(LC_CTYPE, "Russian");
int a = 12;
// Аргумент шаблона задан явно:
cout << abs<int>(a) << endl;
double z = -66.3;
// Пустой список аргументов:
cout << abs<>(z) << endl;
// Без списка аргументов
cout << abs(z) << endl;
short s[5] = {20000,32000,20000,25000,15000};
// Необходимо задавать явно
// все параметры шаблона
cout << sum<short,int>(s, s+5) << endl;
return 0;
}
Результат выполнения программы:
66.3
66.3
Если параметр RT в определении шаблона функции Sum для возвращаемого значения указать первым в списке параметров шаблона, то при вызове функции можно не задавать явно значение для второго параметра шаблона (T) – его компилятор определит автоматически при выведении в процессе инстанцирования:
|
|
template <typename RT, typename T>
RT sum(T * begin, T * end) {
T *p;
RT s = RT();
for (p = begin; p!= end; ++p)
s += *p;
return s;
}
...
short s[5] = {20000,32000,20000,25000,15000};
// Достаточно задать явно только первый
// параметр шаблона:
cout << sum<int>(s, s+5) << endl;
Чтобы применить шаблон функции к типу данных, определённому пользователем (структуре, объекту класса), необходимо перегрузить операции для этого типа, используемые в шаблонной функции.
Прототип шаблона
Как и при работе с обычными функциями, для шаблонов функций существуют определения и описания. В качестве описания шаблона функций используется прототип шаблона:
template <список_формальных_параметров_шаблона>
Прототип_шаблонной_функции
Прототип_шаблонной_функции – это её заголовок (возможно, без имён параметров), вслед за которым помещён разделитель "точка с запятой".
В списке параметров прототипа шаблона имена параметров не обязаны совпадать с именами тех же параметров в определении шаблона.
Шаблонная функция может иметь любое количество нетипизирующих параметров. Может быть нетипизирующим и возвращаемое функцией значение.
Рассмотрим программу, в которой шаблон определяет се мейство функций, каждая из которых вычисляет количество ну левых элементов одномерного массива параметризованного типа.
// Листинг 10.3
|
|
#include <iostream>
using namespace std;
template <typename D> // Прототип шаблона
long count0(int, D *);
int main() {
int A[] = { 0, 1, 0, 0, 6, 0, 4, 10};
int n = sizeof(A)/sizeof(A[0]);
cout << "count0(n,A) = " << count0(n,A) << endl;
double X[] = { 10.0, 0.0, 3.3, 0.0, 2.1};
n = sizeof(X)/sizeof(X[0]);
cout << "count0(n,X) = "<< count0(n,X) << endl;
return 0;
}
// Шаблон функций для определения количества
// нулевых элементов в массиве
template <typename T>
long count0(int size, T* mas) {
long k = 0;
for (int i = 0; i < size; ++i)
if (mas[i] == T()) ++k;
return k;
}
Результат выполнения программы:
count0(n,A) = 4
count0(n,X) = 2