Шаблоны позволяют давать обобщенные, в смысле произвольности используемых типов данных, определения функций и классов. Поэтому их часто называют параметризованными функциями и параметризованными классами. Часто также используются термины «шаблонные функции» и «шаблонные классы».
Шаблон функции представляет собой обобщенное определение функции, из которого компилятор автоматически создает представитель функции для заданного пользователем типа (или типов) данных. Когда компилятор создает по шаблону функции конкретную ее реализацию, то говорят, что он создал порожденную функцию. Синтаксис объявления шаблона функции имеет следующий вид:
За ключевым словом template следуют один или несколько параметров, заключенных в угловые скобки, разделенные между собой запятыми. Каждый параметр является либо ключевым словом class, за которым следует имя типа, либо именем типа, за которым следует идентификатор.
Для задания параметризованных типов данных вместо ключевого слова class может также использоваться ключевое слово typename. Параметры шаблона, следующие за ключевыми словами class или typename, называют параметризованными типами. Они информируют компилятор о том, что некоторый (пока что неизвестный) тип данных используется в шаблоне в качестве параметра (в момент вызова шаблона на место такого параметризованного типа станет тип, заданный программистом). Параметры шаблона, состоящие из имени типа и следующего за ним имени идентификатора, информируют компилятор о том, что параметром шаблона является константа указанного типа. Шаблонную функцию можно вызывать как обычную, никакого специального синтаксиса не требуется.
Процесс построения порожденной функции компилятором называют конкретизацией шаблонной функции.
Шаблоны предоставляют определенные выгоды при программировании, связанные с широкой применимостью кода и легким его сопровождением. В общем, этот механизм позволяет решать те же задачи, для которых используется полиморфизм. С другой стороны, в отличие от макросов, они позволяют обеспечить безопасное использование типов данных. Однако с их использованием связаны и некоторые недостатки:
программа содержит полный код для всех порожденных представителей шаблонного класса или функций;
не для всех типов данных предусмотренная реализация класса или функции оптимальна.
Преодоление второго недостатка возможно с помощью специализации шаблонов.