Ключевое слово concept ввели в С++20 для наложения ограничений на параметры шаблонов. Такой подход позволяет гораздо легче диагностировать ошибки при неправильном использовании параметров шаблона. При срабатывании ограничения на параметры шаблона (concept, на этапе компиляции будет выдана ошибка в доступном для понимания виде (в отличие от обычных ошибок в шаблонах вызывающих десятки непонятных ошибочных сообщений).
Синтаксис использования concept следующий:
template <параметры>
concept имя_концепта = ограничения;
Приведем пример с ограничением на размер типа данных параметра шаблона.
#include <iostream> // cout
template <typename T> // Шаблон
concept size = sizeof(T) <= sizeof(int); // Ограничение size на размер типа данных параметра шаблона <= 4
template <typename T> requires size<T> // Шаблон с использованием ограничения size
//template <size T> // Сокращенная запись идентичная предыдущей строке
auto sqr(T a){ // Функция с использованием шаблонов
return a * a; // Возвращаем квадрат аргумента
}
int main(){
std::cout << sqr(10) << "\n"; //100 Вызов функции для int
std::cout << sqr(3.14f) << "\n"; //9.8596 Вызов функции для float
std::cout << sqr(3.14) << "\n"; //Ошибка ограничения концепта! Вызов функции для double
}
Чтобы убрать ошибку компиляции нужно закомментировать последний вызов функции sqr(3.14) с типом double, который не подходит под ограничение (concept) size.