Имя_шаблонной_функции

<список_фактических_параметров_шаблона>

(список_фактических_параметров_шаблонной_функции);

 

Рассмотрим программу с примерами разных обращений к шаблонным функциям:

 

// Листинг 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

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: