Распространённые стандартные концепции: Integral, Ranges
Используйте концепции стандартной библиотеки, такие как integral и ranges::range.
«Распространённые стандартные концепции: Integral, Ranges» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Стандартная библиотека концептов
В C++20 появилось множество стандартных концептов в <concepts> и <ranges>. Знание этих концептов избавляет от необходимости писать собственные.
Концепты основного языка
Фундаментальные концепты:
std::same_as<T, U>std::derived_from<T, U>std::convertible_to<T, U>std::common_with<T, U>std::assignable_from<T, U>
Арифметические концепты
Ограничивайте типы числовыми:
std::integral— любой целочисленный типstd::signed_integral— знаковый целочисленный типstd::unsigned_integral— беззнаковый целочисленный типstd::floating_point— float, double, long double
template <std::floating_point T>
T mean(T a, T b) { return (a + b) / 2; }Концепты сравнения
Задавайте ограничения для типов, поддерживающих проверку равенства и упорядочивание:
std::equality_comparablestd::totally_orderedstd::three_way_comparable
Концепты объектов
Распространённые требования:
std::movablestd::copyablestd::default_initializablestd::semiregularstd::regular
template <std::regular T>
class Container { /* full-fledged value type */ };Концепты вызываемых объектов
Для функций и функторов:
std::invocable<F, Args...>std::regular_invocable<F, Args...>std::predicate<F, Args...>
template <std::invocable<int> F>
void apply_to_42(F&& f) {
std::forward<F>(f)(42);
}Концепты итераторов
В <iterator>:
std::input_iteratorstd::forward_iteratorstd::bidirectional_iteratorstd::random_access_iteratorstd::contiguous_iterator
Концепты диапазонов (C++20)
Из <ranges>:
std::ranges::range— имеет begin/endstd::ranges::view— диапазон, не владеющий даннымиstd::ranges::sized_range— знает свой размер за O(1)std::ranges::random_access_range
template <std::ranges::range R>
auto first(R&& r) {
return *std::ranges::begin(r);
}Объединение концептов
Сочетайте концепты, чтобы задавать точные требования.
template <std::ranges::random_access_range R>
requires std::integral<std::ranges::range_value_t<R>>
auto sum(const R& r) {
return std::reduce(std::ranges::begin(r), std::ranges::end(r));
}Пользовательские концепты на основе стандартных
Создавайте предметно-ориентированные концепты на основе стандартных.
template <typename T>
concept Number = std::integral<T> || std::floating_point<T>;Алгоритмы на основе концептов
Алгоритмы диапазонов C++20 имеют множество ограничений, заданных концептами. Если передать неподходящий тип, их сообщения об ошибках напрямую указывают, какой концепт не выполнен.
Краткая памятка
По возможности используйте встроенные концепты:
- Числа →
integral/floating_point - Итерация →
ranges::range - Вызываемые объекты →
invocable/predicate - Тип значения →
regularилиsemiregular
Быстрая проверка
Какой стандартный концепт описывает тип, у которого есть и begin(), и end()?
Итоги
Стандартная библиотека предоставляет богатый набор концептов: арифметические (integral, floating_point), сравнимости (equality_comparable), объектов (movable, regular), вызываемых объектов, итераторов и диапазонов. Используйте их как основу собственных ограничений.
Часто задаваемые вопросы
Урок «Распространённые стандартные концепции: Integral, Ranges» бесплатный?
Да — полный текст урока «Распространённые стандартные концепции: Integral, Ranges» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Распространённые стандартные концепции: Integral, Ranges»?
Используйте концепции стандартной библиотеки, такие как integral и ranges::range. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Распространённые стандартные концепции: Integral, Ranges»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему concepts, а не SFINAE
- Определение концепций с помощью requires
- Концепции в шаблонах и auto
- Распространённые стандартные концепции: Integral, Ranges