fork download
  1. #include <iostream>
  2. #include <stdexcept>
  3. #include <type_traits>
  4. //Concept looted from https://stackoverflow.com/a/16000226
  5. // definitely take the time to read the answer to grok what's going on.
  6. template <typename T, typename = int>
  7. struct HasFirst : std::false_type { };
  8.  
  9. template <typename T>
  10. struct HasFirst <T, decltype((void) T::First, 0)> : std::true_type { };
  11.  
  12. template <typename T, typename = int>
  13. struct HasLast : std::false_type { };
  14.  
  15. template <typename T>
  16. struct HasLast <T, decltype((void) T::Last, 0)> : std::true_type { };
  17.  
  18. template <class TYPE>
  19. TYPE do_conversion(int value)
  20. {
  21. static_assert(HasFirst<TYPE>::value, "Need First");
  22. static_assert(HasLast<TYPE>::value, "Need Last");
  23. if (value >= static_cast<int>(TYPE::First) &&
  24. value < static_cast<int>(TYPE::Last))
  25. {
  26. return static_cast<TYPE>(value);
  27. }
  28. throw std::out_of_range("Inv value");
  29. }
  30.  
  31. enum class Weekday
  32. {
  33. Monday,
  34. Tuesday,
  35. Wednesday,
  36. Thursday,
  37. Friday,
  38. Saturday,
  39. Sunday,
  40. Last,
  41. First = Monday
  42. };
  43.  
  44. void demo(int value)
  45. {
  46. try
  47. {
  48. std::cout << "Day " << value << " is ";
  49. switch (do_conversion<Weekday>(value))
  50. {
  51. case Weekday::Monday:
  52. std::cout << "Monday\n";
  53. break;
  54. case Weekday::Tuesday:
  55. std::cout << "Tuesday\n";
  56. break;
  57. case Weekday::Wednesday:
  58. std::cout << "Wednesday\n";
  59. break;
  60. case Weekday::Thursday:
  61. std::cout << "Thursday\n";
  62. break;
  63. case Weekday::Friday:
  64. std::cout << "Friday\n";
  65. break;
  66. case Weekday::Saturday:
  67. std::cout << "Saturday\n";
  68. break;
  69. case Weekday::Sunday:
  70. std::cout << "Sunday\n";
  71. break;
  72. default:
  73. std::cout << "Huh. How did we get here?\n";
  74. break;
  75. }
  76. }
  77. catch (const std::out_of_range& ) {
  78. std::cout << "Invalid\n";
  79. }
  80. }
  81.  
  82. int main()
  83. {
  84. for (int i = -1; i < 10; i++)
  85. {
  86. demo(i);
  87. }
  88. }
  89.  
Success #stdin #stdout 0s 4436KB
stdin
Standard input is empty
stdout
Day -1 is Invalid
Day 0 is Monday
Day 1 is Tuesday
Day 2 is Wednesday
Day 3 is Thursday
Day 4 is Friday
Day 5 is Saturday
Day 6 is Sunday
Day 7 is Invalid
Day 8 is Invalid
Day 9 is Invalid