Шаблон (програмування) – це
Шаблони(англ.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++.
- Шаблони проектування
- C++ - див. template.
- C#, див.
- Узагальнене програмування
- Метапрограмування
- C++0x — новий стандарт C++, що передбачає значне розширення можливостей шаблонів
Література
- Девід Вандевурд, Микола М. ДжосаттісШаблони C++: довідник розробника = C++ Templates: The Complete Guide. - М.: "Вільямс", 2003. - С. 544. - ISBN 0-201-73484-2
Wikimedia Foundation. 2010 .
Дивитись що таке "Шаблон (програмування)" в інших словниках:
Шаблон делегування — Шаблон проектування Шаблон делегування Delegation pattern Описаний у Design Patterns Ні У розробці ПЗ, шаблон делегування (англ. delegation pattern) це спосіб, яким об'єкт зовні виражає деяку поведінку, але в … Вікіпедія
Шаблон Proxy (шаблон проектування) - Шаблон Proxy (Заступник) Шаблон проектування. Надає об'єкт, який контролює доступ, перехоплюючи всі виклики до нього. Зміст 1 Мета 1.1 Проблема 1.2 Рішення 2 Плюси 3 … Вікіпедія
Шаблон Proxy — (Заступник) Шаблон проектування.Надає об'єкт, який контролює доступ, перехоплюючи всі виклики до нього. Зміст 1 Мета 1.1 Проблема 1.2 Рішення 2 Плюси 3 … Вікіпедія
Програмування в обмеженнях — Парадигми програмування Агентно орієнтована Компонентно орієнтована Конкатенативна Декларативна (контрастує з Імперативною) Обмеженнями Функціональна Потоком даних Таблично орієнтована (електронні таблиці) Реактивна … Вікіпедія
Шаблон — Про шаблони у Вікіпедії дивіться сторінку Вікіпедія: Шаблони. Шаблон у техніці пластина (лекало, трафарет тощо) з вирізами, по контуру яких виготовляються креслення чи вироби чи інструмент вимірювання розмірів. … Вікіпедія
Шаблон проектування — Цей термін має й інші значення, див. Паттерн. У розробці програмного забезпечення, шаблон проектування або патерн (англ. design pattern) повторна архітектурна конструкція, що представляє собою вирішення проблеми.
Шаблон делегування (шаблон проектування) — У розробці ПЗ, шаблон делегування (англ. delegation pattern) це спосіб, яким об'єкт зовні висловлює деяку поведінку, але насправді передає відповідальність за виконання цієї поведінки пов'язаному об'єкту. Шаблон делегування… … Вікіпедія
Програмування засноване на прототипах — Прототипне програмування стиль об'єктно орієнтованого програмування, при якому відсутнє поняття класу, а повторне використання (спадкування) здійснюється шляхом клонування існуючого екземпляра об'єкта прототипу.
Заступник (шаблон проектування) - Шаблон Proxy (Заступник) Шаблон проектування. Надає об'єкт, що контролює доступ, перехоплюючи всі виклики доньому. Зміст 1 Мета 1.1 Проблема 1.2 Рішення 2 Плюси 3 … Вікіпедія
Події-орієнтоване програмування — Парадигми програмування Агентно орієнтована Компонентно орієнтована Конкатенативна Декларативна (контрастує з Імперативною) Обмеженнями Функціональна Потоком даних Таблично орієнтована (електронні таблиці) Реактивна … Вікі