C++ Qt:使用模板函数将作用域枚举转换为字符串

C++ Qt:使用模板函数将作用域枚举转换为字符串,c++,qt,C++,Qt,出于日志记录的目的,我想将枚举转换为人类可读的字符串。大多数情况下,我使用的是作用域枚举,因此我需要一个同样适用于作用域枚举的解决方案。 Qt提供了Q_ENUM宏来确保我完成大量工作。要将枚举转换为字符串,我可以这样写: QMetaEnum::fromType<Class::Enum>().valueToKey(int(enum)) 但这不适用于作用域枚举。是否有任何模板解决方案也适用于普通枚举和作用域枚举 示例: class LoggingManager : public QOb

出于日志记录的目的,我想将枚举转换为人类可读的字符串。大多数情况下,我使用的是作用域枚举,因此我需要一个同样适用于作用域枚举的解决方案。 Qt提供了Q_ENUM宏来确保我完成大量工作。要将枚举转换为字符串,我可以这样写:

QMetaEnum::fromType<Class::Enum>().valueToKey(int(enum))
但这不适用于作用域枚举。是否有任何模板解决方案也适用于普通枚举和作用域枚举

示例:

class LoggingManager : public QObject
{
    Q_OBJECT
public:
    enum class Level
    {
        debug,
        info,
        warning,
        error,
        fatal
    };
    Q_ENUM(LoggingManager::Level)

enum Category
        {
            network,
            usb
        };
        Q_ENUM(Category)
    ...
}

QString level = enumToString(LoggingManager::Level::debug) // ""
QString level2 = QMetaEnum::fromType<LoggingManager::Level>().valueToKey(int(LoggingManager::Level::debug)) // "debug"
QString category = enumToString(LoggingManager::usb) // "usb"
Q_ENUM(Class::Enum)
Q_ENUM(Enum)
类日志管理器:公共QObject
{
Q_对象
公众:
枚举类级别
{
调试,
信息,
警告
错误,
致命的
};
Q_枚举(日志管理器::级别)
枚举类别
{
网络,,
usb
};
Q_枚举(类别)
...
}
QString级别=枚举字符串(LoggingManager::level::debug)/“”
QString level2=QMetaEnum::fromType().valueToKey(int(LoggingManager::Level::debug))/“debug”
QString类别=枚举字符串(LoggingManager::usb)/“usb”

好吧,我想出来了

解决方案是在
Q_enum
宏中不使用作用域枚举

错误:

class LoggingManager : public QObject
{
    Q_OBJECT
public:
    enum class Level
    {
        debug,
        info,
        warning,
        error,
        fatal
    };
    Q_ENUM(LoggingManager::Level)

enum Category
        {
            network,
            usb
        };
        Q_ENUM(Category)
    ...
}

QString level = enumToString(LoggingManager::Level::debug) // ""
QString level2 = QMetaEnum::fromType<LoggingManager::Level>().valueToKey(int(LoggingManager::Level::debug)) // "debug"
QString category = enumToString(LoggingManager::usb) // "usb"
Q_ENUM(Class::Enum)
Q_ENUM(Enum)
正确:

class LoggingManager : public QObject
{
    Q_OBJECT
public:
    enum class Level
    {
        debug,
        info,
        warning,
        error,
        fatal
    };
    Q_ENUM(LoggingManager::Level)

enum Category
        {
            network,
            usb
        };
        Q_ENUM(Category)
    ...
}

QString level = enumToString(LoggingManager::Level::debug) // ""
QString level2 = QMetaEnum::fromType<LoggingManager::Level>().valueToKey(int(LoggingManager::Level::debug)) // "debug"
QString category = enumToString(LoggingManager::usb) // "usb"
Q_ENUM(Class::Enum)
Q_ENUM(Enum)
对于大多数用例,使用作用域或非作用域表单是等效的(当您在类中时)。我通常总是使用作用域形式,即使在类内部也是如此,只是要清楚我想说什么。但直接在宏中使用作用域枚举似乎会破坏宏的功能


也许对Qt有更深入了解的人可以解释为什么会这样。但我只记得,在宏中使用作用域形式会使宏崩溃。

你能给出一个有效/无效的示例吗?我试图复制该行为,对我来说,
qDebug()的输出很愚蠢。问题是Q_ENUM(LoggingManager::Level),如果我只写Q_ENUM(Level),它会工作。谢谢你,你让我重新思考这个问题。如果你愿意的话,你可以把这个贴出来作为答案。太好了!我建议你自己写一个答案或者结束这个问题。因此,鼓励回答自己的问题。