CodeNebula
C++11stlintermediate

std::is_integral (C++11 Addition)

C++11 · Modern Revolution · Compiler flag: -std=c++11

Explanation

Compile-time check that determines whether a type is an integral type (bool, char, int, long, etc.).

Real-World Scenario

Constrain a template function to only accept integer types in a math library.

Quick Snippet

snippet.cpp
#include <type_traits>
static_assert(std::is_integral<int>::value, "int is integral");
static_assert(!std::is_integral<double>::value, "double is not integral");

Full Example

is_integral.cpp
// CodeNebula - C++11 Example: is_integral
// Compile: g++ -std=c++11 -Wall -Wextra -o example is_integral.cpp

// Demonstrates std::is_integral to check if a type is an integer type.
// Integral types include bool, char, short, int, long, long long, and
// their signed/unsigned variants.

#include <iostream>
#include <type_traits>

int main() {
    std::cout << "=== std::is_integral ===" << std::endl;

    // Check various types
    std::cout << "int:         " << std::is_integral<int>::value << std::endl;
    std::cout << "bool:        " << std::is_integral<bool>::value << std::endl;
    std::cout << "char:        " << std::is_integral<char>::value << std::endl;
    std::cout << "long long:   " << std::is_integral<long long>::value << std::endl;
    std::cout << "unsigned:    " << std::is_integral<unsigned>::value << std::endl;
    std::cout << "float:       " << std::is_integral<float>::value << std::endl;
    std::cout << "double:      " << std::is_integral<double>::value << std::endl;
    std::cout << "int*:        " << std::is_integral<int*>::value << std::endl;

    // static_assert validates at compile time
    static_assert(std::is_integral<int>::value, "int must be integral");
    static_assert(!std::is_integral<double>::value, "double is not integral");
    static_assert(std::is_integral<const int>::value, "const int is integral");

    // Practical use: SFINAE-friendly template constraint
    std::cout << "\nconst int:   " << std::is_integral<const int>::value << std::endl;
    std::cout << "volatile int:" << std::is_integral<volatile int>::value << std::endl;

    std::cout << "\nAll checks passed!" << std::endl;
    return 0;
}

// Expected output:
// === std::is_integral ===
// int:         1
// bool:        1
// char:        1
// long long:   1
// unsigned:    1
// float:       0
// double:      0
// int*:        0
//
// const int:   1
// volatile int:1
//
// All checks passed!
Run command
g++ -std=c++11 -Wall -Wextra -o example is_integral.cpp