Шаблони C
Матеріал з Seo Wiki - Пошукова Оптимізація та Програмування
Шаблони(англ.template) — засіб мови C++, призначений для кодування узагальнених алгоритмів, без прив'язки до деяких параметрів (наприклад, типів даних, розмірів буферів, значень за замовчуванням).
У C++ можливе створення шаблонів функцій та класів.
Шаблони дозволяють створювати параметризовані класи та функції. Наприклад, нам потрібен якийсь клас:
Тоді для першої моделі пишемо:
Хоча шаблони надають коротку форму запису ділянки коду, насправді їх використання не скорочує код, що здійснюється, так як для кожного набору параметрів компілятор створює окремий екземпляр функції або класу.
Зміст
Синтаксис опису шаблону
Ключове слово typename з'явилося порівняно недавно, тому стандарт допускає використання class замість typename:
ЗамістьTдопустимо будь-який інший ідентифікатор.
Приклад використання
Найпростішим прикладом є визначення мінімуму з двох величин.
Якщо a менше b то повернути а, інакше - повернути b
Без шаблонів програмісту доводиться писати окремі функції кожному за використовуваного типу даних. Хоча багато мов програмування визначають вбудовану функцію мінімуму для елементарних типів (таких як цілі та речові числа), така функція може знадобитися і для складних (наприклад, «час» або «рядок») і дуже складних («гравець» в онлайн-грі) об'єктів .
Так виглядає шаблон функції визначення мінімуму:
Для виклику цієї функції можна просто використати її ім'я:
Виклик шаблонної функції
Взагалі кажучи, для виклику шаблонної функції необхідно вказати значення для всіх параметрівшаблон. Для цього після імені шаблону вказується список значень у кутових дужках:
Для кожного набору параметрів компілятор створює новий екземпляр функції. Процес створення нового екземпляра називається інстанціювання шаблону.
У прикладі вище компілятор створив дві спеціалізації шаблону функції sort (для типів char і int) і дві - шаблон read (для значень BufferSize 20 і 30). Останнє швидше за все марнотратно, тому що для кожного можливого значення параметра компілятор буде створювати нові та нові екземпляри функцій, які відрізнятимуться лише однією константою.
Виведення значень параметрів
У деяких випадках компілятор може вивести (логічно визначити) значення параметра шаблону функції з аргументу функції. Наприклад, при виклику вищеописаної функції sort необов'язково вказувати параметр шаблону (якщо він збігається з типом елементів аргументу-масиву):
У разі використання шаблонів класів із цілими параметрами також можливе виведення цих параметрів. Наприклад:
Правила виведення введені в мову для полегшення використання шаблону та для уникнення можливих помилок, наприклад, спроба використання sort для сортування масиву символів.
Якщо параметр шаблону можна вивести за кількома аргументами, результат виведення має бути точно однаковий всім цих аргументів. Наприклад, такі дзвінки помилкові:
Помилки у шаблонах
Деякі помилки в описі шаблону можуть бути виявлені вже на місці опису. Ці помилки не залежать від певних параметрів. Наприклад:
Помилки, пов'язані з використанням конкретних параметрів шаблону, не можна виявити, перш ніж використовувати шаблон. Наприклад, шаблон min сам по собі не містить помилок, проте використання його з типами,яких операція не визначена, призведе до помилки:
Якщо ввести операцію до першого використання шаблону, то помилка буде усунена. Так проявляється гнучкість шаблонів C++:
Шаблони класів
У класі, що реалізує зв'язковий список цілих чисел, алгоритми додавання нового елемента списку пошуку потрібного елемента не залежать від того, що елементи списку - цілі числа. Ті ж алгоритми застосовувалися б і для списку символів, рядків, дат, класів гравців тощо.
Використання шаблонів
Для використання шаблону класу необхідно вказати його параметри:
Технічні подробиці
Параметри шаблонів
Параметрами шаблонів можуть бути параметри-типи, параметри звичайних типів, параметри-шаблони.
Для параметрів будь-якого типу можна вказувати значення за промовчанням.
Параметри-шаблони
Якщо в шаблоні класу або функції необхідно використовувати той самий шаблон, але з різними параметрами, то використовуються параметри-шаблони. Наприклад:
Шаблони функцій не можна використовувати як параметри-шаблони.
Правила виведення аргументів шаблону функції
Для параметрів, які є типами (наприклад параметр T функції sort), можливе виведення, якщо аргумент функції має один з наступних типів:
Прикладом може бути шаблон функції sort, розглянутий вище
Члени шаблонів класів
Члени шаблону класу є шаблонами, причому з тією ж, що і шаблон класу, параметризацией. Це означає, що визначення функцій-членів слід починати з заголовка шаблону:
Усередині видимості шаблону не потрібно повторювати специфікатор. Це означає, що наприклад A :: A () - це конструктор, хоча можна писати і A :: A ().
Типи як члени класів
Якщо параметр шаблону є клас, у якого є член, який є типом даних, то для використання цього члена потрібно застосовувати ключове слово typename . Наприклад:
Шаблони як члени класів
Проблеми виникають і із членами-шаблонами. Якщо шаблон, який є членом класу, який у свою чергу є параметром шаблону, використовується в цьому шаблоні і не допускає виведення параметрів, необхідно використовувати кваліфікатор template :
Шаблони в інших мовах програмування
Мова Ада має механізми, схожі на шаблони.
Мова D має шаблони, місцями більш потужними, ніж C++. [1]
У Java 5 було запроваджено схожий механізм generic.