A switch statement can make one branch for each enum value.

enum switch Switching on an enum keeps branch labels tied to named states.

Enum Switch

status
enum_switch.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>

enum class OrderStatus {
    NewOrder,
    Paid,
    Shipped
};

int main() {
    OrderStatus status = OrderStatus::NewOrder;
    std::string message;

    switch (status) {
        case OrderStatus::NewOrder:
            message = "wait for payment";
            break;
        case OrderStatus::Paid:
            message = "pack order";
            break;
        case OrderStatus::Shipped:
            message = "send tracking";
            break;
    }

    std::cout << "message=" << message << std::endl;
    return 0;
}
#include <iostream>
#include <string>

enum class OrderStatus {
    NewOrder,
    Paid,
    Shipped
};

int main() {
    OrderStatus status = OrderStatus::Paid;
    std::string message;

    switch (status) {
        case OrderStatus::NewOrder:
            message = "wait for payment";
            break;
        case OrderStatus::Paid:
            message = "pack order";
            break;
        case OrderStatus::Shipped:
            message = "send tracking";
            break;
    }

    std::cout << "message=" << message << std::endl;
    return 0;
}
#include <iostream>
#include <string>

enum class OrderStatus {
    NewOrder,
    Paid,
    Shipped
};

int main() {
    OrderStatus status = OrderStatus::Shipped;
    std::string message;

    switch (status) {
        case OrderStatus::NewOrder:
            message = "wait for payment";
            break;
        case OrderStatus::Paid:
            message = "pack order";
            break;
        case OrderStatus::Shipped:
            message = "send tracking";
            break;
    }

    std::cout << "message=" << message << std::endl;
    return 0;
}
  1. status ← 0, message ← (empty)

    10int main() {11    OrderStatus status→ 0 = OrderStatus::NewOrder; //@status=OrderStatus::Paid, OrderStatus::Shipped12    std::string message→ (empty);
  2. switch (status)

    14switch (status0) {15    case OrderStatus::NewOrder:
  3. message ← wait for payment

    14switch (status) {15    case OrderStatus::NewOrder:16        message→ wait for payment = "wait for payment";17        break;
  4. message = "wait for payment";

    15case OrderStatus::NewOrder:16    message = "wait for payment";17    break;18case OrderStatus::Paid:
  5. std::cout << "message=" << message << std::endl;

    26    std::cout << "message=" << messagewait for payment << std::endl;27    return 0;28}
    outputmessage=wait for payment
  1. status ← 1, message ← (empty)

    10int main() {11    OrderStatus status→ 1 = OrderStatus::Paid;12    std::string message→ (empty);
  2. switch (status)

    14switch (status1) {15    case OrderStatus::NewOrder:
  3. message ← pack order

    17    break;18case OrderStatus::Paid:19    message→ pack order = "pack order";20    break;
  4. message = "pack order";

    18case OrderStatus::Paid:19    message = "pack order";20    break;21case OrderStatus::Shipped:
  5. std::cout << "message=" << message << std::endl;

    26    std::cout << "message=" << messagepack order << std::endl;27    return 0;28}
    outputmessage=pack order
  1. status ← 2, message ← (empty)

    10int main() {11    OrderStatus status→ 2 = OrderStatus::Shipped;12    std::string message→ (empty);
  2. switch (status)

    14switch (status2) {15    case OrderStatus::NewOrder:
  3. message ← send tracking

    20    break;21case OrderStatus::Shipped:22    message→ send tracking = "send tracking";23    break;
  4. message = "send tracking";

    21    case OrderStatus::Shipped:22        message = "send tracking";23        break;24}
  5. std::cout << "message=" << message << std::endl;

    26    std::cout << "message=" << messagesend tracking << std::endl;27    return 0;28}
    outputmessage=send tracking