Требуемое выражение requires
Требуемое выражение requires используется
для задания ограничений на параметры шаблона.
Оно проверяет, удовлетворяет ли тип или выражение
определенным требованиям, и возвращает
true или false. Требуемое выражение
можно использовать как самостоятельное логическое
выражение, так и в составе концептов и
ограничений шаблонов. Внутри requires
перечисляются требования, которые должны
выполняться для заданных типов или выражений.
Синтаксис
requires (параметры) { требования }
Простейшая форма требует только список требований:
requires { требования }
Пример
Давайте проверим, поддерживает ли тип int
операцию сложения. Для этого используем
требуемое выражение requires:
#include <iostream>
using namespace std;
template<typename T>
requires requires(T a, T b) { a + b; }
T add(T a, T b)
{
return a + b;
}
int main()
{
cout << add(2, 3) << endl;
return 0;
}
Результат выполнения кода:
5
Пример
Давайте проверим, есть ли у типа метод
size. Если метод отсутствует,
шаблонная функция не будет участвовать
в разрешении перегрузки:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
template<typename T>
requires requires(T t) { t.size(); }
void printSize(const T& t)
{
cout << t.size() << endl;
}
int main()
{
string str = "abcde";
vector<int> vec = {1, 2, 3};
printSize(str);
printSize(vec);
return 0;
}
Результат выполнения кода:
5
3
Пример
Давайте используем requires внутри
концепта, чтобы описать требование
к типу более подробно:
#include <iostream>
using namespace std;
template<typename T>
concept Addable = requires(T a, T b)
{
a + b;
};
template<Addable T>
T add(T a, T b)
{
return a + b;
}
int main()
{
cout << add(2, 3) << endl;
return 0;
}
Результат выполнения кода:
5
Смотрите также
-
ключевое слово
requires,
которое задает ограничения на параметры шаблона -
концепт
concept,
который именует набор требований к типу -
ограничение
constraint,
которое ограничивает набор принимаемых типов -
конструкция
if constexpr,
которая выбирает ветку на этапе компиляции