КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Шаблони функційУ випадку, коли перевантажені функції відрізняються лише використовуваним типом даних, можна уникнути рутинної роботи по їх визначенню, задавши для них шаблон. Такий спосіб визначення функцій отримав назву механізму шаблонів функцій. Формат оголошення шаблону функцій. template <class T> T ім’я_функції(Т ім’я_параметру,… ) {…} template <typename T> T ім’я_функції(Т ім’я_параметру,…) {…} Тут class - не С++-клас, а так званий параметр шаблона, Т — ідентифікатор формального типу. Оголошення шаблону починається з ключового слова template. В кутових дужках <> записують список формальних типів параметрів шаблона. Кожний формальний тип параметрів складається з ключових слів class або typename, після яких слідує ідентифікатор типу. В даному прикладі це Т. Ідентифікатор, що записаний після слів class або typename, — це стандартний вбудований тип або тип користувача. Визначення функції записують після списку формальних типів параметрів шаблона. Отже, оголошення єдиного шаблона визначає ціле сімейство функцій, параметром яких є сам тип даних. Шаблон функції — це насправді не функція, оскільки вона не приводить до створення програмного коду в пам’яті. Це просто трафарет для створення множини функцій з одного оголошення. Генерація коду не відбуватиметься доти, доки функція не буде реально викликана під час виконання програми. При цьому аргументи конкретних типів, що передаються в шаблонну функцію під час її виклику, вказують компілятору генерувати відповідний до переданих типів код. Наприклад, програма для визначення найбільшого з двох чисел. // Приклад використання шаблонів функцій #include<iostream> #include<stdio.h> using namespace std; int n, m, maxi; char cn, cm, cmaxi; double dn, dm, dmaxi; // ======== шаблон функції визначення максимального значення ======== template <typename T> T MAX(T a,T b) { if (a>b) return a; else return b; } //========== головна функція ============================= int main() { cout<<"enter two integer numbers"<<endl; cin>>n>>m; maxi=MAX(n,m); cout<<"max="<<maxi<<endl; cout<<"enter two double numbers"<<endl; cin>>dn>>dm; dmaxi=MAX(dn,dm); cout<<"max="<<dmaxi <<endl; cout<<"enter two char symbol"<<endl; cin>>cn>>cm; cmaxi=MAX(cn,cm); cout<<"max="<<cmaxi<<endl; system("pause"); } Для першого виклику MAX(n,m) транслятор створить функцію MAX(int, int), замінивши в тілі шаблону тип-параметр T реальним типом (int); при другому виклику MAX(dn,dm) – буде створено функцію MAX(double, double), а при третьому - функцію MAX(char , char). Результати роботи програми:
Шаблону можна вказати не один параметр-тип, а декілька. Наприклад, шаблон, який буде створювати функції, що знаходять аргумент з типом більшого розміру, і повертають цей розмір у байтах: template <class T1, class T2> int maxsize(T1 a, T2 b) { int size_a = sizeof(a); int size_b = sizeof(b); return size_a>size_b ? size_a : size_b; }
|