Ограничения типа также можно использовать для ограничения типов, вместо которых используются заменители auto, auto* и
auto&. Причем везде, где используется auto, также можно указывать ограничение типа: для определения локальных переменных,
для типа результат функции, в лямбда-выражениях и т. д. Всякий раз, когда конкретный тип, который будет применяться вместо auto
,
не удовлетворяет ограничению типа, компилятор выдает ошибку.
Рассмотрим пример:
#include <iostream> #include <concepts> template <typename T> concept Numeric = std::integral<T> || std::floating_point<T>; Numeric auto sum(Numeric auto a, Numeric auto b) { const Numeric auto result{a + b }; return result; } int main() { std::cout << sum(10, 3) << std::endl; // 13 std::cout << sum(10.6, 3.2) << std::endl; // 13.8 }
Здесь определен концепт Numeric
, который предполагает, что тип T должен представлять целое число (std::integral<T>
), либо число с плавающей точкой
(std::floating_point<T>
).
В определении функции sum рядом с заместителем типа auto
применяем данный концеп, ограничивая возможный набор используемых типов, только числовыми типами. Причем это
делам для типа результата функции:
Numeric auto sum
Для типа параметров
(Numeric auto a, Numeric auto b)
Для константы внутри функции
const Numeric auto result{a + b };
Затем можно вызывать эту функцию sum, передавая в нее числа, как целые, так и с плавающей точкой:
sum(10, 3) // 13 sum(10.6, 3.2) // 13.8