Урок 29

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

Когато създавате функции, понякога възникват ситуации, когато две функции извършват една и съща обработка, но работят с различни типове данни (например едната използва int параметри, а другата float). Вече знаете от урок 13, че с помощта на механизма за претоварване на функции можете да използвате едно и също име за функции, които изпълняват различни действия и имат различни типове параметри. Въпреки това, ако функциите връщат стойности от различни типове, трябва да използвате уникални имена за тях (вижте бележката към урок 13). Да предположим, например, че имате функция с име max, която връща максимума от две цели числа. Ако по-късно имате нужда от подобна функция, която връща максимума от две стойности с плаваща запетая, трябва да дефинирате друга функция, като например fmax. В този урок ще научите как да използвате C++ шаблони за бързо създаване на функции, които връщат стойности от различни типове. До края на този урок ще сте усвоили следните основни концепции:

Шаблонът дефинира набор от изрази, с които вашите програми могат по-късно да създават множество функции.

Програмите често използват шаблони на функции за бързо дефиниране на множество функции, които използват едни и същи оператори с различни типове параметри или имат различни типове връщане.

Функционалните шаблони имат конкретни имена, които съответстват на името на функцията, което използвате във вашата програма.

След като вашата програма е дефинирала шаблон за функция, тя може да създаде специфична функция, като използва този шаблон, за да дефинира прототип, който включва името на шаблона, върнатата стойност на функцията и типовете параметри.

По време на компилация C++ компилаторът ще създаде функции във вашата програма, използвайки типовете, посочени в прототипите на функциите, които се отнасят до името на шаблона.

Функционалните шаблони имат уникален синтаксис, който може да не е ясен на пръв поглед. Въпреки това, след като създадете един или два шаблона, ще откриете, че те всъщност са много лесни за използване.

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

Шаблон на функция дефинира независима от типа функция. С този шаблон вашите програми могат да дефинират конкретни функции с необходимите типове. Например, следното е шаблон за функция с име max, която връща по-голямата от две стойности:

шаблон T max(T a, T b)

< if (a >b) return(a); else return(b); >

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

float max(float, float); int max(int, int);

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

шаблон T max(T a, T b)

< if (a >b) return(a) ; else return(b); >

float max (float a, float b)

< if (a >b) return(a) ; else return(b); >

Следната програма MAX_TEMP.CPP използва шаблона max за създаване на функция от тип int и float.

шаблон T max(T a, T b)

< if (a >b) return(a); else return(b); >

float max(float, float);

шаблон void show_array( T *масив,T1 брой)

С шаблонПрограмата array_sort може да създава функции, които сортират малки плаващи масиви (по-малко от 128 елемента) и много големи int масиви, използвайки следните прототипи:

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

КАКВО ТРЯБВА ДА ЗНАЕТЕ

Както вече знаете, използването на шаблони на функции намалява програмирането, като позволява на C++ компилатора да генерира изрази за функции, които се различават само по типове връщане и параметри. В Урок 30 ще научите как да използвате шаблони за създаване на независими от типа или общи класове. Преди да изучавате урок 30, уверете се, че сте усвоили следните основни концепции:

Функционалните шаблони ви позволяват да декларирате независими от типа или общи функции.

Когато вашата програма трябва да използва функция с определени типове данни, тя трябва да посочи прототип на функция, който дефинира необходимите типове.

Когато C++ компилаторът срещне такъв прототип на функция, той ще генерира оператори, съответстващи на тази функция, замествайки необходимите типове.

Вашите програми трябва да създават шаблони за общи функции, които работят с различни типове. С други думи, ако използвате само един тип с функция, няма нужда да използвате шаблон.

Ако една функция изисква множество типове, шаблонът просто присвоява уникален идентификатор на всеки тип, като T, T1 и T2. По-късно в процеса на компилиране C++ компилаторът ще присвои правилно типовете, които сте посочили в прототипа на функцията.