Ce face std::is_integral
std::is_integral_v<T> este true pentru tipurile întregi: int, long, unsigned, short, dar și bool, char, char8_t. std::is_floating_point_v<T> este true pentru float, double, long double.
Ambele ignoră const/volatile, dar nu și referințele: int& nu este considerat întreg. Sunt folosite în static_assert, if constexpr și std::enable_if; în C++20 conceptele std::integral și std::floating_point fac același lucru mai lizibil.
Parametri
| Parametru | Descriere |
|---|---|
T |
Tipul verificat. |
Ce returnează
O constantă bool la compilare.
Exemple
Exemplul 1: Ce tipuri sunt întregi și ce tipuri sunt reale
#include <print>
#include <string>
#include <type_traits>
int main() {
std::println("{:12} {:9} {}", "tip", "întreg", "real");
std::println("{:12} {:9} {}", "int", std::is_integral_v<int>, std::is_floating_point_v<int>);
std::println("{:12} {:9} {}", "bool", std::is_integral_v<bool>, std::is_floating_point_v<bool>);
std::println("{:12} {:9} {}", "char", std::is_integral_v<char>, std::is_floating_point_v<char>);
std::println("{:12} {:9} {}", "const long", std::is_integral_v<const long>, std::is_floating_point_v<const long>);
std::println("{:12} {:9} {}", "double", std::is_integral_v<double>, std::is_floating_point_v<double>);
std::println("{:12} {:9} {}", "int&", std::is_integral_v<int&>, std::is_floating_point_v<int&>);
std::println("{:12} {:9} {}", "std::string", std::is_integral_v<std::string>, std::is_floating_point_v<std::string>);
}
Rezultat
tip întreg real
int true false
bool true false
char true false
const long true false
double false true
int& false false
std::string false false
Exemplul 2: Formatare diferită după tip
#include <print>
#include <type_traits>
template <class T>
void pret(T valoare) {
static_assert(std::is_integral_v<T> || std::is_floating_point_v<T>, "prețul trebuie să fie un număr");
if constexpr (std::is_floating_point_v<T>) {
std::println("{:.2f} lei", valoare);
} else {
std::println("{} lei", valoare);
}
}
int main() {
pret(25);
pret(19.9);
}
Rezultat
25 lei
19.90 lei
Greșeli frecvente
- Uiți că
boolșicharsunt tot tipuri întregi. O funcție restricționată cuis_integralle acceptă și pe ele; exclude-le explicit dacă nu le vrei.
Comenzi înrudite
std::integral: Concepte C++20 care restrâng un șablon la tipuri întregi (integral) sau reale (floating_point).std::enable_if: Activează o funcție-șablon doar pentru tipurile care îndeplinesc o condiție (tehnica SFINAE).std::is_same: Verifică la compilare dacă două tipuri sunt exact același tip.if constexpr: Un if evaluat la compilare: ramura falsă este eliminată complet, deci poate conține cod care nu s-ar compila pentru tipul curent.