Wewnętrznie wartości typu enum to liczby całkowite. Zazwyczaj pisze się enum { field1 = 0, field2 = 1 }. Dużego problemu nie ma bo typ char jest typem arytmetycznym i można go skonwertować na liczbę. Jedyne co to trzeba użyć rzutowania na typ char z typu enum, wtedy to powinno działać.
Ten kod u mnie działa:
enum Field { empty = '|',
circle = 'O',
cross = 'X' };
int main() {
Field znak = empty ;
std::cout << static_cast(znak) << std::endl;
}
Poco do wróbla strzelać z dubeltówki jeżeli można z armaty?
static_cast przeznaczony jest dla bardziej skomplikowanej konwersji, owszem potrafi tez enum na char skonwertować, tylko że proszę pamiętać że static_cast jest wzorcem funkcji, czyli działa wolno, tymczasem to co uważasz za C-like (błędne przekonanie) nie wykonuje nawet jednej operacji assemblera (przynajmniej w tym przypadku).
13tySmok , mylisz się. static_cast, jak sama nazwa wskazuje wykonywane jest w czasie kompilacji i działa praktycznie tak samo jak rzutowanie w starym stylu, a efekt jest ten sam, binarki są identyczne. (przynajmniej na g++) Owszem, static_cast składnią przypomina funkcję sparametryzowaną, ale jest to operator, element języka.
Poza tym ciekawi mnie do jakich bardziej skompilikowanej konwersji przeznaczone jest static_cast? Bo z tego co wiem, to do nich są const_cast, dynamic_cast i reinterpret_cast.
I wreszcie odpowiedź na pytanie “po co static_cast”. Otóż rzutowanie jest złe i brzydkie i równie brzydko powinno wyglądać w kodzie. static_cast jest bardzo łatwo wyszukać w kodzie, tak jak i inne C+±owe operatory rzutowania.
class ca {};
class cb {};
class cab:public ca,public cb {};
cab C;
cb *pb=static_cast(&C); // pb != &C
cab *pc=static_cast(pb); // pc != pb && pc == &C