Search code examples
c++boostenums

boost::describe: How do I get the unadorned enum's name?


Boost describe lets you describe enums and inspect those descriptions. I see how to get an enum's members, but is there a way to get the name of the enumeration itself?

class Outer {

...

enum class MyEnum {
    FirstItem = 88,
    SecondItem = 99,
    };

...

BOOST_DESCRIBE_NESTED_ENUM(MyEnum, FirstItem, SecondItem)
}; // Outer

I'd like to get the unadorned enumeration name "MyEnum" from boost::describe, since typeid(MyEnum).name returns the mangled snigglefritzMyEnumSnigglefritz.

Same for the non-nested version.


Solution

  • I don't think describe stores the name of the type described (surprisingly?). The same goes for classes and unions, judging from the examples.

    Instead you can use Boost Core:

    std::cout << boost::core::demangle(typeid(Outer::MyEnum).name()) << "\n";
    

    Or Boost TypeIndex:

    std::cout << boost::typeindex::type_id<Outer::MyEnum>().pretty_name() << "\n";
    

    E.g.

    Live On Coliru

    #include <boost/core/demangle.hpp>
    #include <boost/type_index.hpp>
    #include <boost/describe.hpp>
    #include <iostream>
    
    struct Outer {
        enum class MyEnum {
            FirstItem  = 88,
            SecondItem = 99,
        };
    
        BOOST_DESCRIBE_NESTED_ENUM(MyEnum, FirstItem, SecondItem)
    }; // Outer
    
    constexpr auto unqualified(std::string_view sv) { return sv.substr(sv.find_last_of(":") + 1); }
    
    int main() {
        auto core = boost::core::demangle(typeid(Outer::MyEnum).name());
        auto tidx = boost::typeindex::type_id<Outer::MyEnum>().pretty_name();
        std::cout << core << "\n";
        std::cout << tidx << "\n";
        std::cout << unqualified(core) << "\n";
        std::cout << unqualified(tidx) << "\n";
    
        for (auto e : {Outer::MyEnum::FirstItem, Outer::MyEnum::SecondItem})
            std::cout << static_cast<int>(e) << " -> " << boost::describe::enum_to_string(e, "unknown") << "\n";
    }
    

    Printing

    Outer::MyEnum
    Outer::MyEnum
    MyEnum
    MyEnum
    88 -> FirstItem
    99 -> SecondItem