Ключевое слово concept
Ключевое слово concept используется для объявления
именованного требования к параметрам шаблона. Концепт
описывает, какими свойствами должен обладать тип, чтобы
его можно было подставить в шаблон. В теле концепта
указывается логическое выражение, которое проверяется
компилятором во время подстановки параметров. Концепт
можно применять к переменным, функциям, классам и
псевдонимам шаблонов. Ограничение задается после имени
шаблона через ключевое слово requires или
непосредственно в списке параметров шаблона.
Синтаксис
template <typename T>
concept ConceptName = requires(T x)
{
// требования к типу T
};
Пример
Давайте объявим концепт Integral, который
требует, чтобы тип был целочисленным, и применим
его к шаблонной функции:
#include <iostream>
#include <type_traits>
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(1, 2) << endl;
return 0;
}
Результат выполнения кода:
3
Пример
Давайте объявим концепт Addable с помощью
выражения requires, которое проверяет,
что для типа определена операция сложения:
#include <iostream>
using namespace std;
template <typename T>
concept Addable = requires(T a, T b)
{
a + b;
};
template <Addable T>
T sum(T a, T b)
{
return a + b;
}
int main()
{
cout << sum(1, 2) << endl;
return 0;
}
Результат выполнения кода:
3
Пример
Давайте объединим несколько требований в один
концепт Numeric с помощью логических
операторов &&:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
concept Numeric = is_integral_v<T> || is_floating_point_v<T>;
template <Numeric T>
T twice(T x)
{
return x + x;
}
int main()
{
cout << twice(5) << endl;
cout << twice(1.5) << endl;
return 0;
}
Результат выполнения кода:
10
3
Смотрите также
-
ключевое слово
requires,
которое задает ограничение для шаблона -
выражение
requires,
которое проверяет корректность выражений -
ключевое слово
constraint,
которое задает ограничение шаблона -
шаблон
enable_if,
который включает шаблон по условию