How do I use an enum value in a switch statement in C++?

C++EnumsSwitch Statement

C++ Problem Overview


I would like to use an enum value for a switch statement. Is it possible to use the enum values enclosed in "{}" as choices for the switch()"?

I know that switch() needs an integer value in order to direct the flow of programming to the appropriate case number. If this is the case, do I just make a variable for each constant in the enum statement?

I also want the user to be able to pick the choice and pass that choice to the switch() statement.

For example:

cout << "1 - Easy, ";
cout << "2 - Medium, ";
cout << "3 - Hard: ";

enum myChoice { EASY = 1, MEDIUM = 2, HARD = 3 };

cin >> ????

switch(????)
{
case 1/EASY:  // (can I just type case EASY?)
    cout << "You picked easy!";
    break;

case 2/MEDIUM:
    cout << "You picked medium!";
    break;

case 3/HARD: // ..... (the same thing as case 2 except on hard.)

default:
    return 0;
}

C++ Solutions


Solution 1 - C++

You can use an enumerated value just like an integer:

myChoice c;

...

switch( c ) {
case EASY:
    DoStuff();
    break;
case MEDIUM:
    ...
}

Solution 2 - C++

You're on the right track. You may read the user input into an integer and switch on that:

enum Choice
{
  EASY = 1, 
  MEDIUM = 2, 
  HARD = 3
};

int i = -1;

// ...<present the user with a menu>...

cin >> i;

switch(i)
{
  case EASY:
    cout << "Easy\n";
    break;
  case MEDIUM:
    cout << "Medium\n";
    break;
  case HARD:
    cout << "Hard\n";
    break;
  default:
    cout << "Invalid Selection\n";
    break;
}

Solution 3 - C++

Some things to note:

You should always declare your enum inside a namespace as enums are not proper namespaces and you will be tempted to use them like one.

Always have a break at the end of each switch clause execution will continue downwards to the end otherwise.

Always include the default: case in your switch.

Use variables of enum type to hold enum values for clarity.

see here for a discussion of the correct use of enums in C++.

This is what you want to do.

namespace choices
{
	enum myChoice 
	{ 
        EASY = 1 ,
		MEDIUM = 2, 
		HARD = 3  
	};
}
    
int main(int c, char** argv)
{
	choices::myChoice enumVar;
	cin >> enumVar;
	switch (enumVar)
	{
		case choices::EASY:
		{
			// do stuff
			break;
		}
		case choices::MEDIUM:
		{
			// do stuff
			break;
		}

		default:
		{
			// is likely to be an error
		}
	};
		
}

Solution 4 - C++

You can use a std::map to map the input to your enum:

#include <iostream>
#include <string>
#include <map>
using namespace std;

enum level {easy, medium, hard};
map<string, level> levels;

void register_levels()
{
	levels["easy"]   = easy;
	levels["medium"] = medium;
	levels["hard"]   = hard;
}

int main()
{
	register_levels();
	string input;
	cin >> input;
	switch( levels[input] )
	{
	case easy:
		cout << "easy!"; break;
	case medium:
		cout << "medium!"; break;
	case hard:
		cout << "hard!"; break;
	}
}

Solution 5 - C++

I had a similar issue using enum with switch cases.

Later, I resolved it on my own....below is the corrected code, and perhaps this might help.

//Menu Chooser Programme using enum
#include <iostream>

using namespace std;
int main()
{
   enum level{Novice=1, Easy, Medium, Hard};
   level diffLevel = Novice;
   int i;
   cout << "\nEnter a level: ";
   cin >> i;

   switch(i)
   {
       case Novice:
           cout << "\nyou picked Novice\n"; break;

       case Easy:
           cout << "\nyou picked Easy\n"; break;

       case Medium:
           cout << "\nyou picked Medium\n"; break;

       case Hard:
           cout << "\nyou picked Hard\n"; break;

       default:
           cout << "\nwrong input!!!\n"; break;
   }
   return 0;
}

Solution 6 - C++

You should keep in mind that if you are accessing a class-wide enum from another function, even if it is a friend, you need to provide values with a class name:

class PlayingCard
{
private:
  enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES };
  int rank;
  Suit suit;
  friend std::ostream& operator<< (std::ostream& os, const PlayingCard &pc);
};

std::ostream& operator<< (std::ostream& os, const PlayingCard &pc)
{
  // Output the rank ...

  switch(pc.suit)
  {
    case PlayingCard::HEARTS:
      os << 'h';
      break;
    case PlayingCard::DIAMONDS:
      os << 'd';
      break;
    case PlayingCard::CLUBS:
      os << 'c';
      break;
    case PlayingCard::SPADES:
      os << 's';
      break;
  }
  return os;
}

Note how it is PlayingCard::HEARTS and not just HEARTS.

Solution 7 - C++

The user's input will always be given to you in the form of a string of characters... if you want to convert the user's input from a string to an integer, you'll need to supply the code to do that. If the user types in a number (e.g. "1"), you can pass the string to atoi() to get the integer corresponding to the string. If the user types in an english string (e.g. "EASY") then you'll need to check for that string (e.g. with strcmp()) and assign the appropriate integer value to your variable based on which check matches. Once you have an integer value that was derived from the user's input string, you can pass it into the switch() statement as usual.

Solution 8 - C++

#include <iostream>
using namespace std;

int main() {

    enum level {EASY = 1, NORMAL, HARD};

    // Present menu
    int choice;
    cout << "Choose your level:\n\n";
    cout << "1 - Easy.\n";
    cout << "2 - Normal.\n";
    cout << "3 - Hard.\n\n";
    cout << "Choice --> ";
    cin >> choice;
    cout << endl;

    switch (choice) {
    case EASY:
    	cout << "You chose Easy.\n";
    	break;
    case NORMAL:
	    cout << "You chose Normal.\n";
	    break;
    case HARD:
	    cout << "You chose Hard.\n";
	    break;
    default:
	    cout << "Invalid choice.\n";
    }

    return 0;
}

Solution 9 - C++

You can cast enum with int.

enum TYPE { one, two, tree };

TYPE u;

u = two;

switch( int( u ) ){
        case one : 
        action = do_something ;
        break;
        case two:
        action = do_something_else;
        break;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBotBotPgmView Question on Stackoverflow
Solution 1 - C++Peter RudermanView Answer on Stackoverflow
Solution 2 - C++Adam HolmbergView Answer on Stackoverflow
Solution 3 - C++radmanView Answer on Stackoverflow
Solution 4 - C++Khaled AlshayaView Answer on Stackoverflow
Solution 5 - C++Aman SinghView Answer on Stackoverflow
Solution 6 - C++v010dyaView Answer on Stackoverflow
Solution 7 - C++Jeremy FriesnerView Answer on Stackoverflow
Solution 8 - C++bornhuskerView Answer on Stackoverflow
Solution 9 - C++maximView Answer on Stackoverflow