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

25. Функции-шаблоны. Примеры.

Функции-шаблоны создаются с использованием ключевого слова template (шаблон). Шаблон используется для создания каркаса функции, оставляя компилятору реализацию подробностей. Общая форма функции-шаблона имеет следующий вид:

template<class птип> возвращаемый_тип имя_функции(список параметров)

{

// тело функции

}

Здесь птип является параметром-типом, «держателем места» для имени типа данных, которое используется функцией. Этот параметр-тип может быть использован в определении функции. Он будет автоматически заменён компилятором на фактический тип данных во время создания конкретной версии функции.

Можно определить несколько типов-шаблонов данных в инструкции template, используя список с запятыми в качестве разделителя. Например, следующая программа создаёт функцию-шаблон имеющую два типа-шаблона.

Явная перегрузка функций-шаблонов

Хотя функция-шаблон перегружает себя по мере необходимости, также можно перегрузить её явным образом. Если перегружается функция – шаблон, то перегруженная функция переопределяет функцию шаблон для того конкретного набора типов параметров, для которых создаётся перегруженная функция. В качестве примера рассмотрим следующую версию функции swap().

Листинг // перегрузка функции-шаблона

#include <iostream>

using namespace std;

template <class X> void Swap(X &a, X &b) // шаблон функции

{

X temp;

temp=a;

a=b;

b=temp;

}

void Swap(int &a, int &b) // отдельная версия Swap()

{

int temp;

temp=a;

a=b;

b=temp;

cout << "Inside overloaded Swap().\n";

}

int main()

{

int i=10, j=20;

double x=10.1, y=23.3;

char a='x', b='z';

cout << "Original i, j: " << i << " " << j << "\n";

cout << "Original x, y: " << x << " " << y << "\n";

cout << "Original a, b: " << a << " " << b << "\n";

Swap(i, j);

Swap(x, y);

Swap(a, b);

cout << "Swapped i, j: " << i << " " << j << "\n";

cout << "Swapped x, y: " << x << " " << y << "\

cout << "Swapped a, b: " << a << " " << b << "\n";

return 0;}

26. Классы-шаблоны. Примеры.

Кроме функций – шаблонов можно также определить классы – шаблоны. Для этого следует создать класс, определяющий все алгоритмы, но фактический тип данных является параметром, определяющимся при создании класса.

Общая форма объявления класса – шаблона приведена ниже:

template <class птип> class имя_класса {

};

Здесь птип является параметром – типом, который будет указан при создании объекта класса. При необходимости можно определить несколько типов – шаблонов, используя список и запятую в качестве разделителя.

После создания класса – шаблона можно создать конкретный экземпляр класса и объекты этого класса, использую общую форму: имя_класса <тип> объект;

Здесь тип является именем типа данных, с которым будет оперировать данный класс.

Функции–члены класса–шаблона являются сами по себе автоматически шаблонами.

В следующей программе создаётся класс–шаблон stack, реализующий стандартный стек «последним вошёл – первым вышел». Он может использоваться для реализации стека с произвольным типом данных.

Листинг 4

#include <iostream> // демонстрация класса-шаблона stack

using namespace std;

const int SIZE = 100;

template <class SType> class stack{ // создание класса-шаблона stack

SType stck[SIZE];

int tos;

public:

stack();

~stack();

void push(SType i);

SType pop();

};

template <class SType> stack<SType>::stack() // функция-конструктор stack

{

tos = 0;

cout << "Stack initialized\n";

}

template <class SType> stack<SType>::~stack() // функция-деструктор stack

{

cout << "Stack destroyed\n";

}

template <class SType> void stack<SType>::push(SType i) // помещение объекта в стек

{

if(tos==SIZE) {

cout << "Stack is full.\n";

return;

}

stck[tos] = i;

tos++;

}

template <class SType> SType stack<SType>::pop() // извлечение объекта из стека

{

if(tos==0) {

cout << "Stack underflow.\n";

return 0;

}

tos--;

return stck[tos];

}

int main()

{

stack<int> a;

stack<char> c;

a.push(1);

a.push(2);

cout << a.pop() << " ";

cout << a.pop() << "\n";

register int i;

for(i=0; i<10; i++) c.push((char) 'A'+i);

for(i=0; i<10; i++) cout << c.pop();

cout << "\n";

getchar();

return 0;

}