Шаблоны функций и классов
Напишите код один раз, а компилятор создаст версию для каждого типа
max для int, другой для double и третий для std::string, вы пишете одну универсальную версию, параметризованную по типу. Когда вы её используете, компилятор сам генерирует нужную конкретную функцию или класс. Это ключевой механизм обобщённого программирования в C++, и вся стандартная библиотека шаблонов (STL) построена на нём.
- писать шаблоны функций с одним или несколькими параметрами-типами,
- позволять компилятору выводить аргументы шаблона или задавать их явно,
- писать шаблоны классов, например обобщённые
PairилиStack, - использовать нетиповые параметры шаблона (например, размер, известный на этапе компиляции),
- объяснять, что такое инстанцирование и почему код шаблонов находится в заголовочных файлах.
1. Какую проблему решают шаблоны?
Представьте, что вам нужна функция, возвращающая большее из двух значений. Без шаблонов вы копируете одну и ту же логику для каждого типа:
int maxOf(int a, int b) { return (a > b) ? a : b; }
double maxOf(double a, double b) { return (a > b) ? a : b; }
std::string maxOf(std::string a, std::string b) { return (a > b) ? a : b; }
Тела идентичны, различается только тип. Это дублирование, готовое «протухнуть»: исправите ошибку в одном месте - забудете про другие. Шаблон позволяет описать форму кода и оставить тип пустым местом, которое заполнят позже.
Аналогия: представьте формочку для печенья. Формочка - это не печенье, а форма. Прижмите её к тесту (int) - получите функцию «формы int»; прижмите к другому тесту (std::string) - получите функцию «формы string». Формочка (шаблон) написана один раз; компилятор по требованию штампует конкретное печенье (реальные функции).