boost::describe:如何获得未修饰的枚举的名称?

问题描述 投票:0回答:1

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

非嵌套版本相同。

c++ boost enums
1个回答
0
投票

我不认为描述存储所描述类型的名称(令人惊讶?)。班级和工会也是如此,从示例来看

您可以使用 Boost Core:

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

或增强类型索引:

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

例如

住在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";
}

印刷

Outer::MyEnum
Outer::MyEnum
MyEnum
MyEnum
88 -> FirstItem
99 -> SecondItem
© www.soinside.com 2019 - 2024. All rights reserved.