Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. #include <iostream>
  2. #include "util.h"
  3.  
  4. struct Foo
  5. {
  6. enum class Color
  7. {
  8. Red = 2, Green = 5, Blue = 10,
  9. };
  10. };
  11.  
  12. template<typename T>
  13. constexpr auto underlying_cast(T x)
  14. {
  15. static_assert(std::is_enum_v<T>, "x is not an enum type.");
  16. return static_cast<std::underlying_type_t<T>>(x);
  17. }
  18.  
  19. template<typename T, T v>
  20. constexpr auto enum_as_string()
  21. {
  22. using namespace util;
  23. #if defined(_MSC_VER)
  24. auto src = std::string_view(__FUNCSIG__);
  25. // auto __cdecl extract_enum_from_sig<enum main::Color,main::Color::Green>(void)
  26. auto leftover = src.substr(src.find(__FUNCTION__));
  27. // extract_enum_from_sig<enum main::Color,main::Color::Green>(void)
  28. leftover = extract_between(leftover, '<', '>');
  29. // enum main::Color,main::Color::Green
  30. return split_last(leftover, ':').second;
  31. #elif defined(__clang__)
  32. auto leftover = std::string_view(__PRETTY_FUNCTION__);
  33. // auto extract_enum_from_sig() [T = Color, v = main()::Color::Green]
  34. leftover = extract_between(leftover, '[', ']');
  35. // T = Color, v = main()::Color::Green
  36. return split_last(leftover, ':').second;
  37. #elif defined(__GNUC__)
  38. auto leftover = std::string_view(__PRETTY_FUNCTION__);
  39. // constexpr auto extract_enum_from_sig() [with T = main()::Color; T v = main::Color::Green]
  40. leftover = extract_between(leftover, '[', ']');
  41. // with T = main()::Color; T v = main::Color::Green
  42. return split_last(leftover, ':').second;
  43. #else
  44. #error "No implementation available!"
  45. #endif
  46. }
  47.  
  48. int main()
  49. {
  50. {
  51. constexpr auto color = Foo::Color::Green;
  52. constexpr auto s = enum_as_string<Foo::Color, color>();
  53. constexpr auto id = underlying_cast(color);
  54. std::cout << "color: " << s << "(" << id << ")" << std::endl;
  55. }
  56. {
  57. constexpr auto color = static_cast<Foo::Color>(10);
  58. constexpr auto s = enum_as_string<Foo::Color, color>();
  59. constexpr auto id = underlying_cast(color);
  60. std::cout << "color: " << s << "(" << id << ")" << std::endl;
  61. }
  62. {
  63. constexpr auto color = static_cast<Foo::Color>(100);
  64. constexpr auto s = enum_as_string<Foo::Color, color>();
  65. constexpr auto id = underlying_cast(color);
  66. std::cout << "color: " << s << "(" << id << ")" << std::endl;
  67. }
  68. return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement