// Code derived from Stroustrup's PPP2 book
// § 9.5.1 “Plain” enumerations
// -and beginning on p 320
#include <iostream>
#include <stdexcept>
using namespace std;
void error(const char* s) { throw runtime_error(s); }
enum Month { // note: no “class”
jan = 1,
feb,
mar,
apr,
may,
jun,
jul,
aug,
sep,
oct,
nov,
dcm // note dec changed to dcm to make it compile, see comment on p. 321
};
enum Day { monday, tuesday, wednesday, thursday, friday, saturday, sunday };
Month int_to_month(int x)
{
if (x < jan || dcm < x)
error("bad month");
return Month(x);
}
void f(int m)
{
[[maybe_unused]] Month mm = int_to_month(m);
// ...
}
int main()
try {
Month m = feb; // OK: feb in scope
[[maybe_unused]] Month m2 = Month::feb; // also OK
// m = 7; // error: can’t assign an int to a Month
[[maybe_unused]] int n = m; // OK: we can assign a Month to an int
[[maybe_unused]] Month mm = Month(7); // convert int to Month (unchecked)
// Month bad = 9999; // error: can't convert an int to a Month
f(4);
f(99); // run-time error: bad month
} catch (exception& e) {
cerr << "error: " << e.what() << '\n';
return 1;
} catch (...) {
cerr << "Oops: unknown exception!\n";
return 2;
}
//------------------------------------------------------------------------------
void do_something() {}
void do_something_else() {}
void my_code([[maybe_unused]] Month m)
{
// if (m == 17) // huh: 17th month?
// do_something();
// if (m == monday) // huh: compare month to Monday?
// do_something_else();
}