шаблони c

Цей термін має також інші значення див. Шаблон.
Шаблони (англ. Template) - засіб мови C ++. призначене для кодування узагальнених алгоритмів. без прив'язки до деяких параметрів (наприклад, типам даних. розмірами буферів, значенням за замовчуванням).

Тоді для першої моделі пишемо: SomeClass <20, int> SomeVariable; для другої: SomeClass <30, double> SomeVariable2;

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

шаблони функцій

Синтаксис опису шаблону

template void sort (T array [], int size); // прототип: шаблон sort оголошений, але не визначений

template // цілочисельний параметр char * read ()

приклад використання

Найпростішим прикладом служить визначення мінімуму з двох величин.

Якщо a менше b то повернути а, інакше - повернути b

За відсутності шаблонів програмісту доводиться писати окремі функції для кожного використовуваного типу даних. Хоча багато мов програмування визначають вбудовану функцію мінімуму для елементарних типів (таких як цілі і речові числа), така функція може знадобитися і для складних (наприклад «час» або «рядок») і дуже складних ( «гравець» в онлайн-грі) об'єктів .

Так виглядає шаблон функції визначення мінімуму:

template T min (T a, T b)

Для виклику цієї функції можна просто використовувати її ім'я: min (1, 2); min ( 'a', 'b'); min (string ( "abc"), string ( "cde"));

Виклик шаблонної функції

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

int i [5] = <5, 4, 3, 2, 1>; sort(I, 5);

char c [] = "бвгда"; sort(C, strlen (c));

sort(C, 5); // помилка: у sort параметр int [], а не char []

char * ReadString = read<20>(); delete [] ReadString; ReadString = read<30>(); Для кожного набору параметрів компілятор генерує новий екземпляр функції. Процес створення нового екземпляра називається інстанцірованія шаблону.

В наведеному вище прикладі компілятор створив дві спеціалізації шаблону функції sort (для типів char і int) і дві спеціалізації шаблону read (для значень BufferSize 20 і 30). Останнє швидше за все марнотратно, так як для кожного можливого значення параметра компілятор буде створювати нові і нові екземпляри функцій, які будуть відрізнятися лише однієї константою.

Виведення значень параметрів

У деяких випадках компілятор може сам вивести (логічно визначити) значення параметра шаблона функції з аргументу функції. Наприклад, при виклику вищеописаної функції sort необов'язково вказувати параметр шаблону (якщо він збігається з типом елементів аргументу-масиву):

int i [5] = <5, 4, 3, 2, 1>; sort (i, 5); // викликається sort

char c [] = "бвгда"; sort (c, strlen (c)); // викликається sort Можливо виведення і в більш складних випадках.

У разі використання шаблонів класів з цілими параметрами також можливо виведення цих параметрів. наприклад:

template class IntegerArray

template // Прототип шаблону void PrintArray (IntegerArray array) // Виклик шаблону

// Використання об'єкта шаблону IntegerArray<20> ia; PrintArray (ia);

Правила виведення введені в мову для полегшення використання шаблону і для уникнення можливих помилок, наприклад спроба використання sort для сортування масиву символів.

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

min (0, 'a'); min (7, 7.0);

Помилки в шаблонах

Деякі помилки в описі шаблону можуть бути виявлені вже в місці опису. Ці помилки не залежать від конкретних параметрів. наприклад:

template void f (T data)

Помилки, пов'язані з використанням конкретних параметрів шаблону, можна виявити до того, як шаблон використаний. Наприклад, шаблон min сам по собі не містить помилок, однак використання його з типами, для яких операція '<' не определена, приведёт к ошибке:

struct A

A obj1, obj2; min (obj1, obj2);

Якщо ввести операцію '<' до первого использования шаблона, то ошибка будет устранена. Так проявляется гибкость шаблонов в C++.

friend inline bool operator<( const A& a1, const A& a2 )

min (obj1, obj2);

шаблони класів

У класі, що реалізовує зв'язний список цілих чисел, алгоритми додавання нового елемента списку, пошуку потрібного елемента не залежать від того, що елементи списку - цілі числа. Ті ж алгоритми застосовувалися б і для списку символів, рядків, дат, класів гравців, і так далі.

template class List

Використання шаблонів

Для використання шаблону класу, необхідно вказати його параметри:

List li; List ls; li.Add (17); ls.Add ( "Hello!");

Технічні подробиці

параметри шаблонів

Параметрами шаблонів можуть бути: параметри-типи, параметри звичайних типів, параметри-шаблони.

Для параметрів будь-якого типу можна вказувати значення за замовчуванням.

template

Параметри-шаблони

Якщо в шаблоні класу або функції необхідно використовувати один і той же шаблон, але з різними параметрами, то будуть використовуватися установки-шаблони. наприклад:

Не можна використовувати шаблони функцій в якості параметрів-шаблонів.

Правила виведення аргументів шаблону функції

Для параметрів, які є типами (наприклад параметр T функції sort) можливо виведення, якщо аргумент функції має один з наступних типів:

Схожі статті