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.
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.
#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