Объекты · Классы и память

Шаблоны и концепты

Один код для многих типов — с понятными ошибками

~35 мин 6 шагов

После урока ты сможешь

  • Писать шаблонные функции и классы
  • Ограничивать шаблоны концептами
  • Понимать сообщения компилятора об ошибках в шаблонах

Шаг 1 из 6

Один код для многих типов

Нужна функция «большее из двух». Для int, для double, для std::string… Писать три одинаковые функции, отличающиеся только типом, скучно, а главное, ошибку потом придётся исправлять трижды.

Шаблон — это функция или класс, в котором тип является параметром:

main.cpp
#include <print>
#include <string>
​
template <typename T>
T maxOf(T a, T b) {
    return a > b ? a : b;
}
​
int main() {
    std::println("{}", maxOf(3, 7));                                   // T = int
    std::println("{}", maxOf(2.5, 1.5));                               // T = double
    std::println("{}", maxOf(std::string("кот"), std::string("пёс"))); // T = std::string
}

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

Если типы аргументов различаются, вывод не сработает: maxOf(3, 4.5) — это int или double? Тогда тип указывают явно: maxOf<double>(3, 4.5).

Проверь себя

Есть template <typename T> T maxOf(T a, T b). Что будет с вызовом maxOf(3, 4.5)?