For DevelopersFebruary 12, 2025

6 Easy Ways to Check Variable Types in C++

Learn six easy ways to check variable types in C++ with examples for debugging and runtime checks.

When you work in C++, type checking helps ensure your program runs correctly by verifying variable or object types. Since C++ is statically typed, the compiler determines variable types at compile time. 

However, there are times when you might need to check or verify types explicitly—like when debugging, working with templates in generic programming, or performing runtime checks.

In this tutorial, you will learn various methods to check the type of variables in C++, along with detailed explanations and examples.

Advance your C++ career with top remote jobs at Index.dev. Join now to get matched with leading global companies!

 

Understanding Data Types in C++

C++ supports several kinds of data types, which can be broadly classified into:

1. Primitive Types:

  • Integer Typesintshortlonglong long
  • Floating-Point Typesfloatdoublelong double
  • Character Typechar
  • Boolean Typebool

2. Derived Types:
 

  • Pointers: Store the memory address of another variable.
  • Arrays: Contain multiple elements of the same type.
  • Functions: Represent callable code blocks.
     

3. User-Defined Types:
 

  • Classes and Structs: Represent objects.
  • Enums: Define named integral constants.

Understanding these classifications will help you choose the right method for type checking.

Learn More: C++ vs Rust: Is C++ being replaced by Rust?

 

Six Methods to Check Variable Types in C++
 

1. Using typeid from <typeinfo>

The typeid operator is part of the <typeinfo> library and allows you to obtain the type of an expression or variable. It returns a type_info object, which includes the name of the type.

Example:

C/C++

#include <iostream>
#include <typeinfo>

int main() {
    int x = 42;
    std::cout << "Type of x: " << typeid(x).name() << std::endl;  // Output: int

    double y = 3.14;
    std::cout << "Type of y: " << typeid(y).name() << std::endl;  // Output: double

    return 0;
}

Explanation:

  • The typeid operator examines the type of the variable and returns its name as a string.
  • Works with primitive, derived, and user-defined types.
  • Use typeid(*ptr) for polymorphic pointers to determine the dynamic type of the object.

 

2. Using decltype

The decltype keyword determines the type of a given expression without evaluating it. It is particularly useful in templates and type-safe assignments.

Example:

C/C++

#include <iostream>

int main() {
    int a = 10;
    decltype(a) b = 20;  // 'b' will have the same type as 'a'.
    std::cout << "Type of b: " << typeid(b).name() << std::endl;  // Output: int

    return 0;
}

Explanation:

  • decltype(expression) deduces the type of the expression.
  • It is commonly used in generic programming to deduce return or parameter types.

 

3. Using Templates for Compile-Time Type Checking

Templates provide a way to enforce type constraints at compile time. You can use traits from the <type_traits> header to check if a variable matches certain properties (e.g., is_integralis_floating_point).

Example:

C/C++

#include <iostream>
#include <type_traits>

template <typename T>
void checkType(const T&) {
    if (std::is_integral<T>::value) {
        std::cout << "Integral type" << std::endl;
    } else if (std::is_floating_point<T>::value) {
        std::cout << "Floating-point type" << std::endl;
    } else {
        std::cout << "Other type" << std::endl;
    }
}

int main() {
    int x = 10;
    checkType(x);  // Output: Integral type

    double y = 3.14;
    checkType(y);  // Output: Floating-point type

    return 0;
}

Explanation:

  • std::is_integral<T>::value checks if the type T is an integral type.
  • Similarly, std::is_floating_point<T>::value checks for floating-point types.
  • This approach is useful for generic code that needs to behave differently for specific types.

 

4. Using Overloaded Functions

Overloading functions allows you to define specific behavior for different types explicitly.

Example:

C/C++

#include <iostream>

void identify(int) { std::cout << "int" << std::endl; }
void identify(double) { std::cout << "double" << std::endl; }
void identify(const std::string&) { std::cout << "string" << std::endl; }

int main() {
    identify(5);         // Output: int
    identify(3.14);      // Output: double
    identify("Hello");  // Output: string

    return 0;
}

Explanation:

  • Each overloaded function corresponds to a specific type.
  • The compiler resolves the correct function based on the variable's type.
  • This method is simple and explicit but requires manual specification of all supported types.

 

5. Using Concepts (C++20)

Concepts, introduced in C++20, allow you to impose compile-time constraints on template parameters. This ensures type safety and improves code clarity.

Example:

C/C++
#include <concepts>
#include <iostream>

template <std::integral T>
void checkIntegral(T) {
    std::cout << "Integral type" << std::endl;
}

int main() {
    checkIntegral(10);  // Output: Integral type
    // checkIntegral(3.14);  // Compilation error: double is not an integral type

    return 0;
}

Explanation:

  • std::integral is a concept that matches all integral types (e.g., intlong).
  • Concepts improve readability and provide meaningful error messages at compile time.

 

6. Using Run-Time Type Information (RTTI)

RTTI is used to determine the type of polymorphic objects at runtime. The typeid operator plays a key role in RTTI.

Example:

C/C++

#include <iostream>
#include <typeinfo>

class Base { virtual void func() {} };  // Polymorphic class
class Derived : public Base {};

int main() {
    Base* obj = new Derived();
    std::cout << "Dynamic type: " << typeid(*obj).name() << std::endl;  // Output: Derived
    delete obj;

    return 0;
}

Explanation:

  • RTTI only works for polymorphic types (classes with at least one virtual function).
  • typeid(*ptr) determines the dynamic type of the object.

 

Explore More: 21 Advanced C++ Coding Challenges for Senior Developers

Conclusion

C++ provides robust tools for type checking at both compile time and runtime. The method you choose depends on your use case:

  • Use typeid and decltype for general type checks.
  • Use templates or concepts for generic programming and compile-time safety.
  • Employ RTTI for polymorphic scenarios.

Understanding these tools helps you write more reliable, maintainable, and error-free programs in C++.

For Developers: Advance your C++ career with top remote jobs on Index.dev. Apply today!

For Clients: Need expert C++ developers fast? Hire top talent in just 48 hours with Index.dev!

Share

Ali MojaharAli MojaharSEO Specialist

Related Articles

For DevelopersWhat If AI Could Tell QA What Your Pull Request Might Break?
Software Development
QA engineers face high-pressure decisions when a new pull request arrives—what should be tested, and what could break? This blog shows how AI can instantly analyze PR diffs, highlight affected components, and suggest test priorities.
Mehmet  Serhat OzdursunMehmet Serhat Ozdursunauthor
For EmployersTech Employee Layoffs 2026: Trends, Numbers & Causes
Tech HiringInsights
This guide analyzes verified tech layoff data from 2020 to 2026. It covers global workforce reductions, industry-wise impact, country distribution, yearly trends, and the main drivers such as AI adoption, restructuring, and budget constraints shaping employment shifts.
Eugene GarlaEugene GarlaVP of Talent