Restricții de tip pentru auto
Restricțiile de tip pot fi, de asemenea, folosite pentru a limita tipurile care sunt utilizate în locul lui auto, auto* și auto&. Astfel, oriunde se folosește auto, se pot adăuga și restricții de tip: pentru definirea variabilelor locale, pentru tipul rezultatului unei funcții, în expresii lambda etc. De fiecare dată când tipul concret care va înlocui auto nu respectă restricția de tip, compilatorul va emite o eroare.
Să luăm un exemplu:
#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
}
Aici este definit conceptul Numeric, care presupune că tipul T trebuie să reprezinte fie un număr întreg (std::integral<T>), fie un număr cu virgulă mobilă (std::floating_point<T>).
În definirea funcției sum, alături de înlocuitorul de tip auto, se aplică acest concept, limitând setul de tipuri posibile pentru parametrii și rezultatul funcției doar la tipuri numerice. De asemenea, se face acest lucru și pentru tipul rezultatului funcției:
Numeric auto sum
Pentru tipurile parametrilor:
(Numeric auto a, Numeric auto b)
Și pentru constanta din interiorul funcției:
const Numeric auto result{a + b};
După aceea, se poate apela funcția sum, transmițându-i valori de tipuri numerice, atât întregi, cât și cu virgulă mobilă:
sum(10, 3) // 13
sum(10.6, 3.2) // 13.8