CodeNebula
C++11stlintermediate

std::is_enum (C++11 Addition)

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

Explanation

Compile-time check that determines whether a type is an enumeration type.

Real-World Scenario

Write a generic to-string converter that handles enum types specially using `underlying_type`.

Quick Snippet

snippet.cpp
#include <type_traits>
enum Color { Red, Green, Blue };
static_assert(std::is_enum<Color>::value, "Color is an enum");

Full Example

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

// Demonstrates std::is_enum to check if a type is an enumeration.
// Works with both unscoped (C-style) and scoped (enum class) enums.

#include <iostream>
#include <type_traits>

enum Color { Red, Green, Blue };
enum class Direction : int { North, South, East, West };
struct MyStruct {};
class MyClass {};

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

    std::cout << "Color:          " << std::is_enum<Color>::value << std::endl;
    std::cout << "Direction:      " << std::is_enum<Direction>::value << std::endl;
    std::cout << "int:            " << std::is_enum<int>::value << std::endl;
    std::cout << "MyStruct:       " << std::is_enum<MyStruct>::value << std::endl;
    std::cout << "MyClass:        " << std::is_enum<MyClass>::value << std::endl;
    std::cout << "bool:           " << std::is_enum<bool>::value << std::endl;
    std::cout << "char:           " << std::is_enum<char>::value << std::endl;

    static_assert(std::is_enum<Color>::value, "Color is an enum");
    static_assert(std::is_enum<Direction>::value, "Direction is an enum");
    static_assert(!std::is_enum<int>::value, "int is not an enum");
    static_assert(!std::is_enum<MyStruct>::value, "struct is not an enum");

    // cv-qualified enums still match
    std::cout << "\nconst Color:    " << std::is_enum<const Color>::value << std::endl;
    std::cout << "volatile Color: " << std::is_enum<volatile Color>::value << std::endl;
    std::cout << "Color*:         " << std::is_enum<Color*>::value << std::endl;

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

// Expected output:
// === std::is_enum ===
// Color:          1
// Direction:      1
// int:            0
// MyStruct:       0
// MyClass:        0
// bool:           0
// char:           0
//
// const Color:    1
// volatile Color: 1
// Color*:         0
//
// All checks passed!
Run command
g++ -std=c++11 -Wall -Wextra -o example is_enum.cpp