Меню сайта

Урок 29. Использование шаблонов функций в C++


СОЗДАНИЕ ПРОСТОГО ШАБЛОНА ФУНКЦИИ

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


template&lt-class Т&gt- Т mах(Т а, Т b)

{
— — -if (а &gt- b) return(а)-
— — -else return(b)-
}

Буква T данном случае представляет собой общий тип шаблона. После определения шаблона внутри вашей программы вы объявляете прототипы функций для каждого требуемого вам типа. В случае шаблона тах следующие прототипы создают функции типа float и int.

float max(float, float)-
int max(int, int)-

Когда компилятор C++ встретит эти прототипы, то при построении функции он заменит тип шаблона T указанным вами типом. В случае с типом float функция тах после замены примет следующий вид:


template&lt-class Т&gt- Т max(Т а, Т b)


{
— — -if (a &gt- b) -return(а) —
— — -else -return(b)-
}

float max(float a, float b)

{
— — -if (a &gt- b) return(a) —
— — -else return(b)- —
}

Следующая программа МАХ_ТЕМР.СРР использует шаблон тах для создания функции типа int и float.

#include &lt-iostream.h&gt-

template&lt-class T&gt- Т mах(Т а, Т b)

{
— — -if (a &gt- b) return(a)-
— — -else return(b)-
}

float max(float, float)-

int max(int, int)-

void main(void)

{
— — -cout &lt-&lt- «Максимум 100 и 200 равен » &lt-&lt- max(100, 200) &lt-&lt- endl-
— — -cout &lt-&lt- «Максимум 5.4321 и 1.2345 равен » &lt-&lt- max(5.4321, 1.2345) &lt-&lt- endl-
}

В процессе компиляции компилятор C++ автоматически создает операторы для построения одной функции, работающей с типом int, и второй функции, работающей с типом float. Поскольку
компилятор C++ управляет операторами, соответствующими функциям, которые вы создаете с помощью шаблонов, он позволяет вам использовать одинаковые имена для функций, которые возвращают значения разных типов. Вы не смогли бы это сделать, используя только перегрузку
функций, как обсуждалось в уроке 13.

Использование шаблонов функций

По мере того как ваши программы становятся более сложными, возможны ситуации, когда вам потребуются подобные функции, выполняющие одни и те же операции, но с разными типами данных. Шаблон функции позволяет вашим программам определять общую, или типонезависимую, функцию. Когда программе требуется использовать функцию для определенного типа, например int или float, она указывает прототип функции, который использует имя шаблона функции и типывозвращаемого значения и параметров. В процессе компиляции C++ создаст соответствующую функцию. Создавая шаблоны, вы уменьшаете количество функций, которые должны кодировать самостоятельно, а ваши программы могут использовать одно и то же имя для функций,выполняющих определенную операцию, независимо от возвращаемого функцией значения и типов параметров.

ШАБЛОНЫ, КОТОРЫЕ ИСПОЛЬЗУЮТ НЕСКОЛЬКО ТИПОВ

Предыдущее определение шаблона для функции max использовало единственный общий тип Т. Очень часто в шаблоне функции требуется указать несколько типов. Например, следующие операторы создают шаблон для функции show_array, которая выводит элементы массива. Шаблон использует тип Т для определения типа массива и тип Т1 для указания типа параметра count:


template&lt-class T,class T1&gt- void show_array(T *array,T1 count)

{
— — -T1 index-
— — -for (index =0- index &lt- count- index++) cout &lt-&lt- array[index] &lt-&lt- » «- —
— — -cout &lt-&lt- endl-
}

Как и ранее, программа должна указать прототипы функций для требуемых типов:

void show_array(int *, int)-
void show_array(float *, unsigned)-

Следующая программа SHOW_TEM.CPP использует шаблон для создания функций, которые выводят массивы типа int и типа float.


#include &lt-iostream.h&gt-

template&lt-class T,class T1&gt- void show_array( T *array,T1 count)

{
— — -T1 index-
— — -for (index =0- index &lt- count- index++) cout &lt-&lt- array[index] » » «-
— — -cout &lt-&lt- endl-
}

void show_array(int *, int)-

void show_array(float *, unsigned)-

void main(void)

{
— — -int pages[] = { 100, 200, 300, 400, 500 }-
— — -float pricesH = { 10.05, 20.10, 30.15 }-
— — -show_array(pages, 5)-
— — -show_array(prices, 3)-
}

Шаблоны и несколько типов

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

template&lt-class Т, class T1&gt- void array_sort(T array[], T1 elements)

{
// операторы —
}

С помощью шаблона array_sort программа может создать функции которые сортируют маленькие массивы типа float (менее 128 элементов) и очень большие массивы типа int, используя следующие прототипы:

void array_sort(float, char)-
void array_sort(int, long)-

ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ

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

    1. Шаблоны функций позволяют вам объявлять типонезависимые, или —общие, функции.
    2. Когда вашей программе требуется использовать функцию с определенными типами данных, она должна указать прототип функции, который определяет требуемые типы.
    3. Когда компилятор C++ встретит такой прототип функции, он создаст операторы, соответствующие этой функции, подставляя требуемые типы.
    4. Ваши программы должны создавать шаблоны для общих функций, которые работают с отличающимися типами. Другими словами, если вы используете с какой-либо функцией только один тип, нет необходимости применять шаблон.
    5. Если функция требует несколько типов, шаблон просто назначает каждому типу уникальный идентификатор, например Т, T1 и Т2. Позже в процессе компиляции компилятор C++ корректно назначит типы, указанные вами в прототипе функции.

Категория: Обучение C++ | Дата: 30.03.13

Меню раздела
Блок