Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 2.9.1 Параметризовані функції - Програмування С, С++теорія та практика (частина 2) - Studbook
Главная->Інформатика та програмування->Содержание->2.9.1 Параметризовані функції

Програмування С, С++теорія та практика (частина 2)

2.9.1 Параметризовані функції

Шаблон функції декларується за допомогою ключового слова ґешріаґе. Це слово використовується для створення шаблону (каркасу), що в загальних рисах описує призначення функції та надає опис операцій - сутність алгоритму, що може застосовуватися до даних різних типів. При цьому конкретний тип даних, над яким функція повинна виконувати операції, передаватиметься їй на етапі компіляції. Загальна форма функції-шаблону має вигляд:

Синтаксис:

їетріаїе <список_аргументів_шаблону> тип ім'я_функції(параметри)

{

// тіло функції

}

Список аргументів шаблону складається з ключового слова сіазз та ідентифікатору (-ів), що визначає його тип. Коли компілятор створюватиме конкретну версію цієї функції, він автоматично замінить цей параметр конкретним типом даних. Цей процес носить назву інстанціювання шаблону.

Зручним є створення прототипу шаблона функції у вигляді його попереднього оголошення. Таке оголошення інформує компілятор про наявність шаблону та його очікуваних параметрах, наприклад: ■Ьетр1а'Ье <с1азз Т> Vоій. £ипк(Т аггау[ ] , зігеаггау) ;

Нижче наведений приклад використання параметризованої функції 8№ар(Т& х, Т& у), що здійснює обмін значеннями між двома її параметрами:

Приклад 1.

#іпс1ийе "з'Ьгііо.Ь"

Їетр1а^е <с1азз Т> Vоій. змар(Т& х, Т& у) ; іп£ таіп()

{

іп£ а=5,Ь=10;

£1оаї с=7,гі=14; сЬаг сЬ='а',сіїЬ='А';

змар(а,Ь); // виклик для цілих аргументів ргіп'Ь£("а=%гі, Ь=%гі\п",а,Ь);

змар <£1оа^>(с,й); // виклик для £1оаї аргументів ргіп'Ь£("с=%£, гі=%£\п",с,гі);

змар <сЬаг>(сЬ,сіїЬ); // виклик для сЬаг аргументів ргіп'Ь£("сЬ=%с, сіїЬ=%с\п",сЬ,сіїЬ) ; ге^игп 0;

}

// визначення параметризованої функції ■Ьетр1а'Ье <с1азз Т> Vоій. змар(Т& х, Т& у)

{

Т ■Ьетр=х ; х=у; у=^етр;

}

Програма відкривається прототипом шаблонної функції. Аналізуючи приклад, зауважимо, що для інстанціювання шаблону застосовуються дві форми.

Конкретний тип для цього визначається компілятором автоматично, виходячи з типів параметрів у місці виклику функції (у наведеному вище прикладі це тип іпґ), або задається явним способом (у прикладі це підстановка типів /Іоаґ та сНаг).

Якби 8№ар() була звичайною функцією, то потрібною була б її реалізація. Оскільки це шаблонна функція, компілятор сам реалізуватиме код такої функції, замінивши у даному випадку тип 8м>ар на іпґ, /Іоаґ та сНаг. Таким чином можна зменшити розмір та складність програми, запропонувавши компілятору реалізацію узагальнених функцій.

Приклад 2. Функція приймає масив невизначеного типу та два цілих, обмінюючи зміст елементів масиву з індексами х та у ^етр1а^е <с1азз Т> VОій. сЬапде (Т £[ ], іп£ х, іп£ у)

{

Т ^тр=^[х];

£[х]=£[у];

£[у]=-Ьтр;

}

Коректними будуть такі виклики функцій за цим шаблоном: ДоиЬ1е аг[7]={2,3,4,5,6,7,8};

сЬапде(аг,2,3); // або сЬапде <гіоиЬ1е>(аг,2,3); сЬаг саг[5] = {'а' ,'Ь' ,'с' ,'гі.' ,'е'}; сЬапде(саг,1,4); // або сЬапде <сЬаг>(саг,1,4);

Таким чином, є можливість легко створювати нові функції, підставляючи в існуючі шаблони конкретні аргументи.

 

40