Кратко:
Концепты в C++ используются для ограничения типов в шаблонах, проверяя выполнение определенных условий. Это облегчает создание более надежного и понятного кода. Концепты определяются с помощью ключевого слова concept.
Основные свойства концептов:
- Ограничение типов: концепты определяют, какие типы могут быть использованы в шаблонах.
- Выражаемость: условия для типов определяются с помощью логических выражений.
- Улучшение сообщений об ошибках: компилятор выдает более понятные сообщения, если тип не соответствует требованиям концепта.
Пример кода
Определение концепта
#include <concepts>
#include <iostream>
 
// Определение концепта, который проверяет, что тип поддерживает операцию сравнения
template<typename T>
concept EqualityComparable = requires(T a, T b) {
    { a == b } -> std::convertible_to<bool>;
};
 
template<typename T>
requires EqualityComparable<T>
bool areEqual(const T& a, const T& b) {
    return a == b;
}
 
int main() {
    int x = 5;
    int y = 5;
 
    if (areEqual(x, y)) {
        std::cout << "x and y are equal" << std::endl;
    } else {
        std::cout << "x and y are not equal" << std::endl;
    }
 
    return 0;
}Объяснение концепта EqualityComparable
- Концепт EqualityComparableопределяет, что типTдолжен поддерживать операцию сравнения на равенство (==), результат которой приводится кbool.
- Функция areEqualиспользует концептEqualityComparableдля ограничения типа параметров.
- В mainфункцияareEqualвызывается с типомint, который удовлетворяет требованиям концепта.
Пример с использованием нескольких концептов
#include <concepts>
#include <iostream>
 
// Концепт, проверяющий, что тип поддерживает арифметические операции
template<typename T>
concept Arithmetic = std::integral<T> || std::floating_point<T>;
 
template<typename T>
requires Arithmetic<T>
T add(const T& a, const T& b) {
    return a + b;
}
 
int main() {
    int x = 5;
    int y = 10;
    double a = 2.5;
    double b = 3.5;
 
    std::cout << "Sum of integers: " << add(x, y) << std::endl; // Вывод: 15
    std::cout << "Sum of doubles: " << add(a, b) << std::endl; // Вывод: 6.0
 
    return 0;
}Объяснение концепта Arithmetic
- Концепт Arithmeticиспользует стандартные концептыstd::integralиstd::floating_point, чтобы проверить, что типTявляется либо целым числом, либо числом с плавающей запятой.
- Функция addограничивает типы параметров концептомArithmetic.
- В mainфункцияaddвызывается с целыми и дробными числами, которые удовлетворяют требованиям концепта.