std::integral în C++

Concepte C++20 care restrâng un șablon la tipuri întregi (integral) sau reale (floating_point).

Sintaxă
#include <concepts>
template<class T> concept integral = std::is_integral_v<T>;
template<class T> concept floating_point = std::is_floating_point_v<T>;

Ce face std::integral

Un concept este o condiție pe tipuri, cu nume. std::integral<T> este satisfăcut de tipurile întregi (inclusiv bool și char), iar std::floating_point<T> de float, double, long double.

Se pot folosi în trei feluri: în lista de șablon (template <std::integral T>), cu auto în parametru (void f(std::integral auto x)) sau într-o clauză requires. Dacă tipul nu se potrivește, mesajul de eroare spune clar ce condiție nu este îndeplinită.

Parametri

Parametru Descriere
T Tipul verificat.

Ce returnează

Un concept: o condiție bool verificată la compilare.

Exemple

Exemplul 1: Funcții restrânse la anumite tipuri

#include <concepts>
#include <print>

template <std::integral T>
bool estePar(T n) { return n % 2 == 0; }

double medie(std::floating_point auto a, std::floating_point auto b) { return (a + b) / 2; }

int main() {
    std::println("14 par: {}", estePar(14));
    std::println("7L par: {}", estePar(7L));
    std::println("medie: {}", medie(9.5, 8.0f));
    // estePar(2.5);   // eroare: double nu satisface std::integral
}

Rezultat

14 par: true
7L par: false
medie: 8.75

Exemplul 2: Conceptele ca valori bool

#include <concepts>
#include <print>

int main() {
    std::println("integral<int>: {}", std::integral<int>);
    std::println("integral<bool>: {}", std::integral<bool>);
    std::println("integral<double>: {}", std::integral<double>);
    std::println("floating_point<float>: {}", std::floating_point<float>);
}

Rezultat

integral<int>: true
integral<bool>: true
integral<double>: false
floating_point<float>: true

Greșeli frecvente

  • Scrii std::integral T fără template sau fără auto: void f(std::integral x). Nu compilează; conceptul trebuie urmat de auto în lista de parametri.

Comenzi înrudite

  • std::is_integral: is_integral verifică dacă un tip este întreg (inclusiv bool și char); is_floating_point, dacă este real.
  • std::same_as: Concepte C++20: same_as cere exact același tip, convertible_to cere un tip care se poate converti în altul.
  • concept: Dă un nume unui set de cerințe pentru tipuri, folosit ca să restrângi ce tipuri acceptă un șablon.
  • requires: Scrie cerințe pentru parametrii unui șablon: ca clauză care restrânge șablonul sau ca expresie care verifică dacă un cod este valid.
  • std::enable_if: Activează o funcție-șablon doar pentru tipurile care îndeplinesc o condiție (tehnica SFINAE).