РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
714 of 815 menu

Предложение requires

Предложение requires используется в шаблонах C++ для задания ограничений на параметры шаблона. Оно позволяет указать, какими свойствами должен обладать тип, чтобы шаблон мог быть использован. В первом параметре указывается список требований к типу, а во втором - выражение или тип, который проверяется на соответствие этим требованиям. Если ограничение не выполняется, компилятор исключает данную перегрузку или специализацию из рассмотрения.

Предложение requires может использоваться в нескольких контекстах: в качестве ограничения для параметра шаблона, в условных выражениях if constexpr, а также в составе requires-выражений для проверки синтаксической корректности выражений.

Синтаксис

template <typename T> requires (требование1 && требование2) void func(T value);

Также существует форма с использованием requires непосредственно после списка параметров шаблона:

template <typename T> requires std::is_integral_v<T> T add(T a, T b);

Пример

Давайте создадим шаблонную функцию, которая принимает только целочисленные типы, используя предложение requires:

#include <iostream> #include <type_traits> using namespace std; template <typename T> requires is_integral_v<T> T add(T a, T b) { return a + b; } int main() { cout << add(1, 2) << endl; return 0; }

Результат выполнения кода:

3

Пример

Давайте создадим две перегрузки функции с разными ограничениями requires и посмотрим, какая из них будет выбрана для целочисленного типа и для типа с плавающей точкой:

#include <iostream> #include <type_traits> using namespace std; template <typename T> requires is_integral_v<T> void print(T value) { cout << "integral: " << value << endl; } template <typename T> requires is_floating_point_v<T> void print(T value) { cout << "floating: " << value << endl; } int main() { print(5); print(3.14); return 0; }

Результат выполнения кода:

"integral: 5" "floating: 3.14"

Пример

Давайте используем предложение requires вместе с концептом для ограничения шаблонного класса:

#include <iostream> #include <concepts> using namespace std; template <typename T> requires integral<T> class Container { public: T value; Container(T v) : value(v) {} void show() { cout << value << endl; } }; int main() { Container<int> c(42); c.show(); return 0; }

Результат выполнения кода:

42

Смотрите также

  • ключевое слово concept,
    которое позволяет именовать ограничения шаблонов
  • выражение requires,
    которое проверяет корректность выражений
  • ключевое слово constraint,
    которое задает ограничения на параметры шаблона
  • шаблон template,
    который создает обобщенные функции и классы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить