Шаблоны функций и классов: повторение
Пишите обобщённые функции и классы с правильным синтаксисом шаблонов.
«Шаблоны функций и классов: повторение» — бесплатный урок 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); // doubletypename и 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 — локальная установка не требуется.
Все уроки этого курса
- Шаблоны функций и классов: повторение
- Специализация шаблонов: частичная и полная
- Вариативные шаблоны и пакеты параметров
- Функции constexpr и if constexpr