Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include "util.h"
- struct Foo
- {
- enum class Color
- {
- Red = 2, Green = 5, Blue = 10,
- };
- };
- template<typename T>
- constexpr auto underlying_cast(T x)
- {
- static_assert(std::is_enum_v<T>, "x is not an enum type.");
- return static_cast<std::underlying_type_t<T>>(x);
- }
- template<typename T, T v>
- constexpr auto enum_as_string()
- {
- using namespace util;
- #if defined(_MSC_VER)
- auto src = std::string_view(__FUNCSIG__);
- // auto __cdecl extract_enum_from_sig<enum main::Color,main::Color::Green>(void)
- auto leftover = src.substr(src.find(__FUNCTION__));
- // extract_enum_from_sig<enum main::Color,main::Color::Green>(void)
- leftover = extract_between(leftover, '<', '>');
- // enum main::Color,main::Color::Green
- return split_last(leftover, ':').second;
- #elif defined(__clang__)
- auto leftover = std::string_view(__PRETTY_FUNCTION__);
- // auto extract_enum_from_sig() [T = Color, v = main()::Color::Green]
- leftover = extract_between(leftover, '[', ']');
- // T = Color, v = main()::Color::Green
- return split_last(leftover, ':').second;
- #elif defined(__GNUC__)
- auto leftover = std::string_view(__PRETTY_FUNCTION__);
- // constexpr auto extract_enum_from_sig() [with T = main()::Color; T v = main::Color::Green]
- leftover = extract_between(leftover, '[', ']');
- // with T = main()::Color; T v = main::Color::Green
- return split_last(leftover, ':').second;
- #else
- #error "No implementation available!"
- #endif
- }
- int main()
- {
- {
- constexpr auto color = Foo::Color::Green;
- constexpr auto s = enum_as_string<Foo::Color, color>();
- constexpr auto id = underlying_cast(color);
- std::cout << "color: " << s << "(" << id << ")" << std::endl;
- }
- {
- constexpr auto color = static_cast<Foo::Color>(10);
- constexpr auto s = enum_as_string<Foo::Color, color>();
- constexpr auto id = underlying_cast(color);
- std::cout << "color: " << s << "(" << id << ")" << std::endl;
- }
- {
- constexpr auto color = static_cast<Foo::Color>(100);
- constexpr auto s = enum_as_string<Foo::Color, color>();
- constexpr auto id = underlying_cast(color);
- std::cout << "color: " << s << "(" << id << ")" << std::endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement