Определение концепций с помощью requires
Определяйте пользовательские концепции с помощью выражений requires и ограничений.
«Определение концепций с помощью requires» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Ключевое слово concept
Объявляйте концепцию с помощью template <params> concept Name = expression; Выражение должно быть логическим значением, вычисляемым во время компиляции.
template <typename T>
concept Integer = std::is_integral_v<T>;Объединение признаков типов
Используйте логические операторы, чтобы объединять признаки в концепт.
template <typename T>
concept SignedInteger = std::is_integral_v<T> && std::is_signed_v<T>;Выражение проверки требований
Более выразительная форма: перечислите операции, которые должен поддерживать тип.
template <typename T>
concept Addable = requires(T a, T b) {
a + b;
};Составные требования
Внутри requires можно указать тип результата и дополнительные ограничения.
template <typename T>
concept Number = requires(T a, T b) {
{ a + b } -> std::convertible_to<T>;
{ a * b } -> std::convertible_to<T>;
};Вложенные требования
Добавьте requires внутрь выражения requires, чтобы подключить именованные концепты.
template <typename T>
concept Sortable = requires(T t) {
{ t.begin() };
{ t.end() };
requires std::movable<typename T::value_type>;
};Требования к типам
Можно потребовать, чтобы тип имел определённые вложенные типы или псевдонимы.
template <typename T>
concept HasValueType = requires {
typename T::value_type;
};Использование концептов в шаблонах
Три синтаксических варианта:
// 1. Replace typename
template <Integer T>
T increment(T x) { return x + 1; }
// 2. requires after template parameters
template <typename T>
requires Integer<T>
T increment(T x) { return x + 1; }
// 3. requires after function signature
template <typename T>
T increment(T x) requires Integer<T> {
return x + 1;
}Концепты и параметры с автоматическим выводом типа
Ограничения можно задавать и для сокращённых шаблонов функций.
void process(Integer auto x) { std::cout << x; }Несколько ограничений
Объединяйте концепты с помощью && и ||.
template <std::integral T, std::integral U>
requires (sizeof(T) >= sizeof(U))
T promote(U value) { return static_cast<T>(value); }Соглашения об именовании
В большинстве кода для концептов используется CamelCase. Некоторые библиотеки используют нижний регистр, как и стандартная библиотека. Выберите соглашение и придерживайтесь его.
Концепты в шаблонах классов
Ограничивайте шаблоны классов тем же способом.
template <std::integral T>
class Counter { T value_; /* ... */ };Повторно используемые концепты
Определяйте библиотеку небольших концептов и составляйте из них более сложные. Повторно используемые концепты делают шаблоны самодокументируемыми и упрощают их сопровождение.
Быстрая проверка
Какой синтаксис внутри выражения requires проверяет, что результат a + b можно преобразовать к T?
Итоги
Определяйте концепты с помощью concept Name = expression. Используйте выражения requires для ограничений на основе операций, включая составные, вложенные требования и требования к типам. Объединяйте концепты с помощью && и ||, чтобы задавать сложные ограничения.
Часто задаваемые вопросы
Урок «Определение концепций с помощью requires» бесплатный?
Да — полный текст урока «Определение концепций с помощью requires» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Определение концепций с помощью requires»?
Определяйте пользовательские концепции с помощью выражений requires и ограничений. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Определение концепций с помощью requires»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему concepts, а не SFINAE
- Определение концепций с помощью requires
- Концепции в шаблонах и auto
- Распространённые стандартные концепции: Integral, Ranges