0Pricing
C++ Academy · Урок

Определение концепций с помощью 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 — локальная установка не требуется.

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

  1. Почему concepts, а не SFINAE
  2. Определение концепций с помощью requires
  3. Концепции в шаблонах и auto
  4. Распространённые стандартные концепции: Integral, Ranges
← Назад к C++ Academy