Скачиваний:
316
Добавлен:
28.03.2021
Размер:
378.53 Кб
Скачать

51. Понятие параметризированных функций. Параметризированные функции с двумя и более обобщенными типами. Перегрузка параметризированной функции.

Функции общего назначения используются в самых различных ситуациях, возможно несколькими разными программистами. Обычно не следует создавать функцию общего назначения с использованием глобальных данных. Вся информация функции должна передаваться с помощью параметров. В некоторых случаях, когда это возможно, следует использовать статические переменные.

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

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

Обобщенная функция создается с помощью ключевого слова template. Обычное значение слова "template" точно отражает цель его применения в C++. Это ключевое слово используется для создания шаблона (или оболочки), который описывает действия, выполняемые функцией. Компилятору же остается "дополнить недостающие детали" в соответствии с заданным значением параметра. Общий формат определения шаблонной функции имеет следующий вид.

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

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

Определение обобщенной функции начинается с ключевого слова template. Здесь элемент Ttype представляет собой "заполнитель" для типа данных, обрабатываемых функцией. Это имя может быть использовано в теле функции. Но оно означает всего лишь заполнитель, вместо которого компилятор автоматически подставит реальный тип данных при создании конкретной версии функции. И хотя для задания обобщенного типа в template-объявлении по традиции применяется ключевое слово class, можно также использовать ключевое слово typename.

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

#include <iostream>

using namespace std;

template <class type1, class type2> void myfunc(type1 x, type2 y)

{

cout << x << ' ' << у << '\n';

}

int main()

{

myfunc(10, "Привет");

myfunc(0.23, 10L);

return 0;

}

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

// Перегрузка шаблонной функции.

#include <iostream>

using namespace std;

template <class X> void swapargs(X &a, X &b)

{

X temp;

temp = a;

a = b;

b = temp;

cout << "Выполняется шаблонная функция swapargs.\n";

}

// Эта функция переопределяет обобщенную версию функции

swapargs() для int-параметров.

void swapargs(int &а, int &b)

{

int temp;

temp = a;

a = b;

b = temp;

cout << "Это int-специализация функции swapargs.\n";

}