Шаблоны функций и классов
Шаблон функции
Шаблон позволяет описать алгоритм, который работает с разными типами:
template <typename T>T Max(T a, T b) { return a < b ? b : a;}Вызовы Max(2, 5) и Max(2.5, 7.0) создают подходящие специализации. Для сравнения типов должно существовать выражение operator< с нужным смыслом.
Шаблон класса
template <typename T>class Box {public: explicit Box(T value) : value(std::move(value)) {} const T& Get() const { return value; }private: T value;};Пример: Box<std::string> box("hello");.
Вывод аргументов
Компилятор часто выводит тип шаблонного параметра из аргументов. Но вывод не всегда возможен, особенно если тип не встречается в параметрах или аргументы имеют несовместимые типы. Тогда тип указывают явно.
Где размещать реализацию
Шаблон обычно должен быть определён в заголовке, видимом в месте инстанцирования. Поэтому реализацию шаблонной функции часто помещают в .h или .hpp, а не скрывают в отдельном .cpp.
Ограничения с concepts
Начиная с C++20 можно задавать требования к типам:
#include <concepts>template <std::integral T>T Add(T a, T b) { return a + b;}std::integral ограничивает типы целочисленными. Concepts помогают получать более понятные ошибки и выражать требования интерфейса.
Итог
Шаблоны позволяют переиспользовать алгоритмы и структуры данных без потери информации о типе. Держи реализации доступными для инстанцирования и формулируй требования к типам явно.
