Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

6.3. Шаблоны функций и классов

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

Шаблоны (templates) – средство для реализаций параметризированных классов и функций на языке С++.

6.3.1. Шаблоны функций. Пример 6.2 (шаблон функции)

Если функция выполняет одни и те же действия над аргументами различных типов, можно параметризировать такую функцию, то есть оформить в виде шаблона. Например:

void swap(int& x, int& y)

{

int temp=x;

x=y;

y=temp;

}

template<class TYPE>

void swap(TYPE& x, TYPE& y)

{

TYPE temp=x;

x=y;

y=temp;

}

Для создания шаблона мы заменили тип int на лексему TYPE с помощью ключевого слова template в скобках <>. Компилятор же выполнит замену наоборот, он заменит лексему TYPE на любой тип, который ему указать:

// использование шаблона

double x=1.5, y=1.6;

swap<double>(x,y); // в данном случае тип double

Генерация функции по шаблону и ее аргументу называется инстанцирование. Возможно выведение типа аргумента шаблона по типам его аргументов, но лучше явно указывать параметр в скобках <>.

/////////////////////////////////////////////////////////////////////////////

// Прикладное программирование

// Пример 6.2. Шаблон функции

//

// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru

// СПб НИУ ИТМО

/////////////////////////////////////////////////////////////////////////////

#include <iostream>

#include <string>

using namespace std;

/////////////////////////////////////////////////////////////////////////////

// шаблон функции, меняющий местами значения двух переменных

// TYPE - параметр шаблона (тип данных переменных)

template<class TYPE>

void Swap(TYPE& x, TYPE& y)

{

TYPE temp=x;

x=y;

y=temp;

}

/////////////////////////////////////////////////////////////////////////////

// тестирование шаблона функции

void main()

{

double dx=1.5, dy=1.6;

cout<<dx<<" "<<dy<<endl;

Swap<double>(dx, dy); // TYPE заменяется на double

cout<<dx<<" "<<dy<<endl;

int ix=1, iy=5;

cout<<ix<<" "<<iy<<endl;

Swap<int>(ix, iy); // TYPE заменяется на int

cout<<ix<<" "<<iy<<endl;

string sx="one", sy="two";

cout<<sx<<" "<<sy<<endl;

Swap<string>(sx, sy); // TYPE заменяется на string

cout<<sx<<" "<<sy<<endl<<endl;

}

6.3.2. Шаблоны функций с несколькими параметрами. Пример 6.3 (шаблон функции с несколькими параметрами)

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

/////////////////////////////////////////////////////////////////////////////

// Прикладное программирование

// Пример 6.3. Шаблоны функций с несколькими параметрами

//

// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru

// СПб НИУ ИТМО

/////////////////////////////////////////////////////////////////////////////

#include <iostream>

using namespace std;

/////////////////////////////////////////////////////////////////////////////

// шаблон функции с двумя параметрами TYPE1 и TYPE2

// преобразование переменно x типа TYPE1 к типу TYPE2

template<class TYPE1, class TYPE2>

bool transform(TYPE1 x, TYPE2& y)

{

if(sizeof(y) < sizeof(x))

return false;

y=(TYPE2)x;

return true;

}

/////////////////////////////////////////////////////////////////////////////

// шаблон функции с двумя параметрами: типом и числовым значением

// функция вычисляет факториал числа n

template<class TYPE, int n>

TYPE factorial()

{

TYPE sum=1;

int i=1;

while(i<=n)

{

sum*=i;

i++;

}

return sum;

}

/////////////////////////////////////////////////////////////////////////////

// тестирование шаблона функции с несколькими параметрами

void main()

{

int x=1;

double y;

// преобразование типа int в double

transform<int, double>(x, y);

cout<<"double("<<x<<")="<<y<<endl<<endl;

double res=factorial<double, 4>();

cout<<"4!="<<res<<endl;

}

/////////////////////////////////////////////////////////////////////////////