Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Родовые функции





 

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

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

 

template <typename тип >

тип-возврата имя-функции (список-параметров)

{

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

}

 

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

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

 

// Пример родовой функции.

 

#include <iostream>

using namespace std;

#include <соnio.h>

 

// Родовая функция, которая обменивает значения своих аргументов.

// Здесь X - это родовой тип данных.

// Это родовая функция.

template <typename X>

void swapargs (X &a, X &b)

{

X temp;

temp = a;

a = b;

b = temp;

};

 

int main ()

{

int i = 10, j =20;

double x=10.1, y=23.3;

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

 

cout << "Исходные i, j: " << i << ' ' << j << '\n';

cout << "Исходные x, y: " << x << ' ' << y << '\n';

cout << "Исходные a, b: " << a << ' ' << b << '\n';

 

swapargs (i, j); // обменяем целые

swapargs (x, y); // обменяем значения с плавающей точкой

swapargs (a, b); // обменяем символы

 

cout << "После обмена i, j: " << i << ' ' << j << '\n';

cout << "После обмена x, у: " << x << ' ' << y << '\n';

cout << "После обмена a, b: " << a << ' ' << b << '\n';

 

getch();

return 0;

}

 

Рассмотрим детально эту программу. Строка

 

template <typename Х>

void swapargs (X &a, X &b)

 

сообщает компилятору, что, во-первых, создается шаблон и, во-вторых, что начинается родовое объявление. В этой строке X — это условное имя родового типа. Далее объявляется функция swapargs(). которая использует X как тип данных для обмениваемых значений. В main() функция swapargs() вызывается с аргументами трех различных типов: int, float и char. Поскольку swapargs() является родовой функцией, компилятор автоматически создает три варианта swapargs(): один, который будет обменивать целые числа, другой для обмена чисел с плавающей точкой и третий для символов. Таким образом, одна и та же родовая функция swapargs() может быть использована для обмена аргументов любых типов данных.

Приведем несколько важных терминов, имеющих отношение к шаблонам. Во-первых, родовые функции (т. е. функции, объявления которых начинаются с предложения template) называют также шаблонными функциями. Когда компилятор создает конкретный вариант этой функции, говорят: что создается специализация. Ее также называют порожденной функцией. Про акт порождения функции говорят, что создается экземпляр родовой функции. В целом можно сказать, что порожденная функция является специализированным экземпляром родовой функции.

 

Date: 2015-11-15; view: 515; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию