Tuesday, 18 December 2018

c++ - Why is enum class preferred over plain enum?



I heard a few people recommending to use enum classes in C++ because of their type safety.




But what does that really mean?


Answer



C++ has two kinds of enum:




  1. enum classes

  2. Plain enums




Here are a couple of examples how to declare them:



 enum class Color { red, green, blue }; // enum class
enum Animal { dog, cat, bird, human }; // plain enum


What is the difference between two?




  • enum classes - enumerator names are local to the enum and their values do not implicitly convert to other types (like another enum or int)



  • Plain enums - where enumerator names are in the same scope as the enum and their
    values implicitly convert to integers and other types




Example:



enum Color { red, green, blue };                    // plain enum 
enum Card { red_card, green_card, yellow_card }; // another plain enum
enum class Animal { dog, deer, cat, bird, human }; // enum class
enum class Mammal { kangaroo, deer, human }; // another enum class


void fun() {

// examples of bad use of plain enums:
Color color = Color::red;
Card card = Card::green_card;

int num = color; // no problem

if (color == Card::red_card) // no problem (bad)

cout << "bad" << endl;

if (card == Color::green) // no problem (bad)
cout << "bad" << endl;

// examples of good use of enum classes (safe)
Animal a = Animal::deer;
Mammal m = Mammal::deer;

int num2 = a; // error

if (m == a) // error (good)
cout << "bad" << endl;

if (a == Mammal::deer) // error (good)
cout << "bad" << endl;

}


Conclusion:




enum classes should be preferred because they cause fewer surprises that could potentially lead to bugs.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print ...