Шаблоны — введение в обобщенное программирование

Статья в википедии

Многие алгоритмы могут работать с различными типами данных, например, алгоритм поиска максимума или алгоритм сортировки списка. По сути, реализация такого алгоритма для разных типов (например, реализация функции сортировки массива целых чисел, массива действительных чисел и массива строк) будет выглядеть абсолютно одинаково для всех перечисленных типов. То есть алгоритм сортировки является некоторым “обобщенным” алгоритмом, не привязанным к какому-либо конкретному типу.

Язык программирования C++ позволяет создавать такие “обобщенные алгоритмы”, с использованием абстрактного типа, вместо какого-либо конкретного типа. Вот как это можно сделать при помощи популярных функций:

template <typename T>
T min(T a, T b)
{
    if (a < b)
        return a;
    else
        return b;
}

После этого можно пользоваться указанными функциями для различных типов данных.

Ключевое слово template означает, что данная функция явлется шаблоном. После этого в угловых скобках идет описание параметров шаблона. Как правило, это один или несколько базовых типов, используемых в функции. Описание типа начинается со слова typename, после которого идет идентификатор типа. Например, запиcь template <typename T> обозначает, что это шаблон от одного базового типа, которому дан идентификатор T. Этот идентификатор можно использовать, например, для объявления переменных такого типа внутри функции-шаблона.

Можно также объявлять и структуры данных, являющиеся шаблонами. Например, тип Fraction можно сделать структурой, использующую тип int для представления числителя и знаменателя, а можно использовать тип long long - в этом случае дробь будет занимать больше памяти, зато позволит работать с большими числами. Реализовать шаблон-структуру можно так:

template <typename T>
struct Fraction
{
    T a;
    T b;

    // Конструктор
    Fraction(T x = 1, T y = 0)
    {
        ...
    }
};

Для объявление переменной типа шаблон-структура нужно явно указать базовый тип вот так:

Fraction<int> P;
Fraction<long long> Q;

Несложно понять, что такие структуры данных, как vector, set, map на самом деле являются шаблонами структур. А само название библиотеки STL расшифровывается, как “Standard Template Library” — стандартная библиотека шаблонов.