Boost describe 让您描述枚举并检查这些描述。我了解了如何获取枚举的成员,但是有没有办法获取枚举本身的名称?
class Outer {
...
enum class MyEnum {
FirstItem = 88,
SecondItem = 99,
};
...
BOOST_DESCRIBE_NESTED_ENUM(MyEnum, FirstItem, SecondItem)
}; // Outer
我想从 boost::describe 获取朴素的枚举名称“MyEnum”,因为
typeid(MyEnum).name
返回损坏的 snigglefritzMyEnumSnigglefritz。
非嵌套版本相同。
我不认为描述存储所描述类型的名称(令人惊讶?)。班级和工会也是如此,从示例来看。
您可以使用 Boost Core:
std::cout << boost::core::demangle(typeid(Outer::MyEnum).name()) << "\n";
或增强类型索引:
std::cout << boost::typeindex::type_id<Outer::MyEnum>().pretty_name() << "\n";
例如
#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";
}
印刷
Outer::MyEnum
Outer::MyEnum
MyEnum
MyEnum
88 -> FirstItem
99 -> SecondItem