fork(2) download
  1. template <typename...> struct enum_list;
  2. template <typename Enum, typename... Enums>
  3. struct enum_list<Enum, Enums...> : enum_list<Enums...>
  4. {
  5. using base_t = enum_list<Enums...>;
  6. static constexpr int base() { return 100 * sizeof...(Enums); }
  7. static constexpr int unified(Enum value) { return int(value) + base(); }
  8. static constexpr Enum separated(int value, Enum dummy) { return static_cast<Enum>(value - base()); } // plus assertions?
  9. using base_t::unified;
  10. using base_t::separated;
  11. };
  12.  
  13. template <typename Enum>
  14. struct enum_list<Enum>
  15. {
  16. static constexpr int base() { return 0; }
  17. static constexpr int unified(Enum value) { return int(value); }
  18. static constexpr Enum separated(int value, Enum dummy) { return static_cast<Enum>(value); }
  19. };
  20.  
  21. ///// example
  22. enum Foo { A, B, C };
  23. enum Bar { D, E, F };
  24.  
  25. typedef enum_list<Foo, Bar> unifier;
  26.  
  27. template <typename Unifier = unifier, typename E>
  28. int unify(E value) {
  29. return Unifier::unified(value);
  30. }
  31.  
  32. template <typename E, typename Unifier = unifier>
  33. E separate(int value) {
  34. return Unifier::separated(value, E());
  35. }
  36.  
  37. #include <iostream>
  38. int
  39. main()
  40. {
  41. std::cout << unify(B) << std::endl;
  42. std::cout << unify(F) << std::endl;
  43. std::cout << separate<Foo>(101) << std::endl;
  44. std::cout << separate<Bar>(1) << std::endl;
  45. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
101
2
1
1