Ограничения типа для auto

Последнее обновление: 31.03.2023

Ограничения типа также можно использовать для ограничения типов, вместо которых используются заменители 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850