C++ Academy · Урок

Шаблоны функций и классов: повторение

Пишите обобщённые функции и классы с правильным синтаксисом шаблонов.

Урок 1 из 414 шагов

«Шаблоны функций и классов: повторение» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Зачем нужны шаблоны

Шаблоны позволяют написать код один раз, а компилятору — сгенерировать отдельные версии для каждого используемого типа. Это основа обобщённого программирования.

Синтаксис шаблона функции

Объявляйте параметры типов с помощью template <typename T>. Используйте T в сигнатуре функции.

template <typename T>
T max_of(T a, T b) {
    return (a > b) ? a : b;
}

std::cout << max_of(3, 7);          // int
std::cout << max_of(2.5, 1.5);      // double

typename и class

Ключевые слова typename и class взаимозаменяемы в объявлениях параметров шаблона. В современном стиле чаще используется typename.

Несколько параметров типов

Шаблоны могут иметь несколько параметров типов.

template <typename T, typename U>
auto combine(T a, U b) -> decltype(a + b) {
    return a + b;
}

Параметры, не являющиеся типами

Параметрами шаблона также могут быть значения, не являющиеся типами: целые числа, перечисления и указатели.

template <typename T, size_t N>
struct StaticArray {
    T data[N];
};

StaticArray<int, 10> arr;

Шаблоны классов

Обобщённые классы используют тот же синтаксис шаблонов. Используйте параметр типа для членов класса и методов.

template <typename T>
class Stack {
    std::vector<T> data_;
public:
    void push(T x) { data_.push_back(std::move(x)); }
    T pop()        { T t = std::move(data_.back()); data_.pop_back(); return t; }
};

Stack<int> s1;
Stack<std::string> s2;

Функции-члены вне класса

Определения вне класса требуют префикса шаблона для каждого члена.

template <typename T>
class Stack {
public:
    void push(T x);
};

template <typename T>
void Stack<T>::push(T x) {
    data_.push_back(std::move(x));
}

Аргументы шаблона по умолчанию

Аналогично аргументам функции по умолчанию. Используются, когда вызывающий код не указывает значение.

template <typename T = int>
class Box {
    T value;
};

Box<> b;       // T is int

Вывод аргументов шаблона

Компилятор часто выводит аргументы шаблона из вызова.

template <typename T>
void print(T x) { std::cout << x; }

print(42);          // T deduced as int
print("hello");    // T deduced as const char*
print<double>(3);   // explicit

Вывод аргументов шаблона класса (C++17)

C++17 позволяет не указывать аргументы шаблона класса, если их можно вывести из конструктора.

std::pair p(1, 2.5);            // pair<int, double>
std::vector v{1, 2, 3};         // vector<int>

Двухфазный поиск имён

Поиск имён в шаблонах выполняется в две фазы: при определении (независимых имён) и при создании экземпляра (зависимых имён). Благодаря этому многие ошибки обнаруживаются уже во время определения.

Сообщения об ошибках

Ошибки в шаблонах могут пугать. Читайте сообщение снизу вверх, сосредоточьтесь на месте в исходном коде и используйте концепции C++20 для улучшения диагностики.

Быстрая проверка

Какая возможность позволяет скомпилировать std::vector v{1, 2, 3}; без указания std::vector<int>?

Итоги

Шаблоны генерируют код для конкретных типов во время компиляции. Объявляйте шаблоны функций и классов с помощью template <typename T>. Компилятор выводит аргументы, когда это возможно; при необходимости указывайте их явно.

Можно начать бесплатно

Изучай C++ с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Шаблоны функций и классов: повторение» бесплатный?

Да — полный текст урока «Шаблоны функций и классов: повторение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблоны функций и классов: повторение»?

Пишите обобщённые функции и классы с правильным синтаксисом шаблонов. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Шаблоны функций и классов: повторение»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Шаблоны функций и классов: повторение
  2. Специализация шаблонов: частичная и полная
  3. Вариативные шаблоны и пакеты параметров
  4. Функции constexpr и if constexpr
← Назад к C++ Academy