euchre
Enumerated Type
An enumerated type (enum) represents a named set of values.  For example, the suit of a playing card.
enum Suit {
  SPADES   = 0,
  HEARTS   = 1,
  CLUBS    = 2,
  DIAMONDS = 3,
};
int main() {
  Suit trump = CLUBS;
}
An enum is represented by a number.
Suit trump = CLUBS;
cout << trump << endl; // 2
Operators like < or == compare the numeric representation of an enum.
Suit s1 = SPADES;
Suit s2 = DIAMONDS;
s1 < s2;  // true
s1 == s2; // false
An enum can be implicitly converted to an int.
int suit_num = CLUBS; // CLUBS -> 2
An int can be converted to an enum with static_cast.
Suit suit = static_cast<Suit>(2); // 2 -> CLUBS
Loop over an enum starting at the first value and ending at the last.  The numeric representation of the enum must be in order.
for (int s = SPADES; s <= DIAMONDS; ++s) {
  Suit suit = static_cast<Suit>(s);
}
Overloading the stream insertion operator (output) prints a string instead of the numeric representation.
std::ostream & operator<<(std::ostream &os, Suit suit) {
  // logic for printing each Suit
}
int main() {
  Suit trump = CLUBS;
  cout << trump; // "Clubs"
}
Overloading the stream extraction operator (input) makes it easier to read an enum from user input.
std::istream & operator>>(std::istream &is, Suit &suit) {
  // logic for reading each Suit
}
int main() {
  Suit suit;
  cin >> suit;  // user types "Clubs"
}