Концепции в шаблонах и auto
Ограничивайте шаблоны функций и сокращённые шаблоны функций с помощью концепций.
«Концепции в шаблонах и auto» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Итоги: три синтаксических варианта
Применять концепт можно тремя способами: как префикс параметра шаблона, как предложение requires или с помощью сокращённого синтаксиса шаблона функции.
Синтаксис с префиксом
Замените typename именем концепта.
template <std::integral T>
T add(T a, T b) { return a + b; }Синтаксис предложения requires
Добавьте requires после списка параметров шаблона. Это наиболее гибкий вариант — он поддерживает сложные условия.
template <typename T>
requires std::integral<T> || std::floating_point<T>
T add(T a, T b) { return a + b; }Замыкающее предложение requires
Поместите requires после сигнатуры функции — это полезно для функций-членов, когда ограничение зависит от параметров.
template <typename T>
class Container {
public:
void sort() requires std::sortable<T> { /* ... */ }
};Сокращённые шаблоны функций
Используйте auto в параметрах и задайте для него ограничение. Компилятор создаст шаблон автоматически.
void greet(std::convertible_to<std::string> auto name) {
std::cout << "Hello " << name;
}Несколько параметров с автоматическим выводом типа
Для каждого auto можно задать собственный концепт. Каждый auto создаёт независимый параметр шаблона.
auto multiply(std::integral auto a, std::integral auto b) {
return a * b;
}Концепты с шаблонами классов
Применяются те же три синтаксических варианта.
template <std::movable T>
class Buffer { /* ... */ };
template <typename T>
requires std::default_initializable<T>
class Storage { /* ... */ };Ограниченные лямбда-выражения (C++20)
Лямбда-выражения могут иметь явные параметры шаблона с концептами.
auto print = []<std::integral T>(T x) {
std::cout << x << " is integral";
};
print(42);Разрешение перегрузки на основе концептов
Компилятор выбирает наиболее ограниченную подходящую перегрузку. Более конкретные концепты имеют приоритет над менее конкретными.
void process(std::integral auto x) { std::cout << "int\n"; }
void process(std::signed_integral auto x) { std::cout << "signed\n"; }
process(42); // calls signed_integral versionОграниченные функции-члены
Члены шаблона класса могут иметь собственные ограничения.
template <typename T>
class Optional {
T value_;
public:
void clear() requires std::is_trivially_destructible_v<T> { /* fast */ }
void clear() { /* general */ }
};Ограниченные типы с инициализацией по умолчанию
Сочетайте requires со значениями по умолчанию, чтобы писать понятные шаблоны, отражающие намерения разработчика.
Рекомендации по стилю
В типичном случае используйте синтаксис с префиксом. Переходите к requires, когда ограничения сложны или затрагивают несколько типов. Для коротких целевых функций используйте сокращённые шаблоны функций.
Быстрая проверка
Как выглядит сокращённый синтаксис шаблона функции «функция, принимающая любое целочисленное значение»?
Итоги
Применяйте концепты в виде префиксов, в предложениях requires или в сокращённых шаблонах функций. Побеждает наиболее ограниченная подходящая перегрузка. Используйте самый понятный подходящий синтаксис: префикс для простых случаев, requires для сложных, сокращённый вариант для коротких функций.
Часто задаваемые вопросы
Урок «Концепции в шаблонах и auto» бесплатный?
Да — полный текст урока «Концепции в шаблонах и auto» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Концепции в шаблонах и auto»?
Ограничивайте шаблоны функций и сокращённые шаблоны функций с помощью концепций. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Концепции в шаблонах и auto»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему concepts, а не SFINAE
- Определение концепций с помощью requires
- Концепции в шаблонах и auto
- Распространённые стандартные концепции: Integral, Ranges