Шаблон представляет собой описание параметризованной функции (или класса), в которой не указана информация об используемых типах данных. Такие неопределённые типы задаются при использовании функции через параметры шаблона. Это дает возможность с помощью одной функции обрабатывать данные различных типов без использования перегрузки.
Для каждого нового типа, используемого в качестве параметра шаблона, компилятор автоматически породит новую реализацию функции.
Для создания шаблона используется конструкция с ключевым словом template, предшествующая заголовку функции.
template <class Имя_типа1, class Имя_типа2>
заголовок_функции
Здесь Имя_типа означает фиктивный тип, который будет использован внутри функции на правах обычного типа данных и который будет явно задан параметром шаблона при его использовании. Вместо ключевого слова class допускается применять typename, семантически они равнозначны.
Пример написания шаблона функции, меняющей значения своих параметров местами (аргументы передаются по ссылке):
В примере шаблона идентификатор T представляет собой обобщенный тип, который конкретизируется при вызове функции. Так как функция в программе вызывается с тремя различными типами данных – int, double и unsigned char – компилятор автоматически сгенерирует три реализации функции tswap.
При определении шаблонов следует помнить следующие правила:
- типы-параметры шаблона должны быть уникальными во всём определении шаблона;
- список параметров функции-шаблона не может быть пустым;
- все параметры шаблона должны быть обязательно использованы в заголовке функции для описания её формальных параметров.
Пример шаблонов, выполняющих простейшие действия с массивами любых встроенных типов:
#include <iostream>
using namespace std;
/* прибавляет к элементам массива arr1 значения
соответствующих элементов массива arr2 */
template <class TArr1, class TArr2>
void add_array(TArr1 arr1[], TArr2 arr2[], short size)
Функция add_array принимает 3 параметра – 2 массива и их размер. Типы элементов массива заданы в виде параметров шаблона (TArr1 и TArr2), поэтому они могут быть разными (в программе использованы типы int и double). Функция к каждому элементу первого массива прибавляет значение соответствующего элемента второго массива.
Вторая функция print_array позволяет выводить на экран массивы любых стандартных типов. Этот шаблон имеет один параметр – Elem.