Многие алгоритмы могут работать с различными типами данных, например, алгоритм поиска максимума или алгоритм сортировки списка. По сути, реализация такого алгоритма для разных типов (например, реализация функции сортировки массива целых чисел, массива действительных чисел и массива строк) будет выглядеть абсолютно одинаково для всех перечисленных типов. То есть алгоритм сортировки является некоторым “обобщенным” алгоритмом, не привязанным к какому-либо конкретному типу.
Язык программирования 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” — стандартная библиотека шаблонов.