Come posso generare il valore di una classe enum in C++11

Come posso generare il valore di una classe enum in C++11

A differenza di un'enumerazione senza ambito, un'enumerazione con ambito non è implicita convertibile nel suo valore intero. Devi esplicitamente convertilo in un numero intero usando un cast:

std::cout << static_cast<std::underlying_type<A>::type>(a) << std::endl;

Potresti voler incapsulare la logica in un modello di funzione:

template <typename Enumeration>
auto as_integer(Enumeration const value)
    -> typename std::underlying_type<Enumeration>::type
{
    return static_cast<typename std::underlying_type<Enumeration>::type>(value);
}

usato come:

std::cout << as_integer(a) << std::endl;

#include <iostream>
#include <type_traits>

using namespace std;

enum class A {
  a = 1,
  b = 69,
  c= 666
};

std::ostream& operator << (std::ostream& os, const A& obj)
{
   os << static_cast<std::underlying_type<A>::type>(obj);
   return os;
}

int main () {
  A a = A::c;
  cout << a << endl;
}

È possibile ottenere che il tuo secondo esempio (ovvero quello che utilizza un'enumerazione con ambito) funzioni utilizzando la stessa sintassi delle enumerazioni senza ambito. Inoltre, la soluzione è generica e funzionerà per tutte le enumerazioni con ambito, rispetto alla scrittura di codice per ciascuna enum con ambito (come mostrato nella risposta fornita da @ForEveR).

La soluzione è scrivere un generico operator<< funzione che funzionerà per qualsiasi enum con ambito. La soluzione utilizza SFINAE tramite std::enable_if ed è il seguente.

#include <iostream>
#include <type_traits>

// Scoped enum
enum class Color
{
    Red,
    Green,
    Blue
};

// Unscoped enum
enum Orientation
{
    Horizontal,
    Vertical
};

// Another scoped enum
enum class ExecStatus
{
    Idle,
    Started,
    Running
};

template<typename T>
std::ostream& operator<<(typename std::enable_if<std::is_enum<T>::value, std::ostream>::type& stream, const T& e)
{
    return stream << static_cast<typename std::underlying_type<T>::type>(e);
}

int main()
{
    std::cout << Color::Blue << "\n";
    std::cout << Vertical << "\n";
    std::cout << ExecStatus::Running << "\n";
    return 0;
}