Статьи

Учебные материалы по языку C++ — от основ до продвинутых тем

Шаблоны функций и классов

Страница 29 из 43 · 2026-10-25 · 1 мин чтения

Шаблоны функций и классов

Шаблон функции

Шаблон позволяет описать алгоритм, который работает с разными типами:

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 помогают получать более понятные ошибки и выражать требования интерфейса.

Итог

Шаблоны позволяют переиспользовать алгоритмы и структуры данных без потери информации о типе. Держи реализации доступными для инстанцирования и формулируй требования к типам явно.