Ограничение шаблона
Ограничение шаблона (constraint) - это механизм C++20,
позволяющий накладывать требования на параметры шаблона.
Если ограничение не выполняется, шаблон не участвует в разрешении
перегрузки. Ограничения задаются с помощью концептов (concept)
или выражений requires. В первом параметре указывается
ограничение, а во втором - параметры шаблона, к которым оно применяется.
Синтаксис
template <typename T>
requires Constraint<T>
void func(T value);
// или короче:
template <Constraint T>
void func(T value);
Пример
Давайте создадим концепт Integral, который требует,
чтобы тип был целочисленным, и ограничим им шаблонную функцию:
#include <iostream>
#include <concepts>
using namespace std;
template <typename T>
concept Integral = is_integral_v<T>;
template <Integral T>
T add(T a, T b)
{
return a + b;
}
int main()
{
cout << add(2, 3) << endl;
return 0;
}
Результат выполнения кода:
5
Пример
Давайте попробуем передать в функцию add значение типа
double и убедимся, что ограничение запрещает вызов:
#include <iostream>
#include <concepts>
using namespace std;
template <typename T>
concept Integral = is_integral_v<T>;
template <Integral T>
T add(T a, T b)
{
return a + b;
}
int main()
{
// add(2.5, 3.5); // ошибка компиляции
cout << add(10, 20) << endl;
return 0;
}
Результат выполнения кода:
30
Пример
Давайте используем выражение requires напрямую
для ограничения шаблона, требующего наличия метода size:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
template <typename T>
requires requires(T t) { t.size(); }
void printSize(const T& value)
{
cout << value.size() << endl;
}
int main()
{
string str = "abcde";
vector<int> vec = {1, 2, 3, 4, 5};
printSize(str);
printSize(vec);
return 0;
}
Результат выполнения кода:
5
5
Смотрите также
-
ключевое слово
concept,
которое объявляет именованное ограничение -
ключевое слово
requires,
которое задает требование к шаблону -
выражение
requires-expression,
которое проверяет корректность выражений -
тип
constraint,
который представляет собой ограничение шаблона