Предложение 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,
который создает обобщенные функции и классы