Кратко:

Концепты в 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 вызывается с целыми и дробными числами, которые удовлетворяют требованиям концепта.