Qt:使用模板函数将范围枚举转换为字符串

时间:2019-05-15 09:26:40

标签: c++ qt

出于记录目的,我想将枚举转换为人类可读的字符串。大多数情况下,我使用范围枚举,因此我需要一种适用于范围枚举的解决方案。 Qt提供了Q_ENUM宏,以确保我的工作安全。要将枚举转换为字符串,我可以这样写:

QMetaEnum::fromType<Class::Enum>().valueToKey(int(enum))

必须将显式强制转换为int才能将作用域枚举转换为int,因为valueToKey必须使用整数值进行调用。这适用于作用域枚举,但我想使用某种模板函数进行转换。我在另一个问题中找到了以下模板解决方案:

template<typename QEnum>
QString enumToString (QEnum value)
{
  return QMetaEnum::fromType<QEnum>().valueToKey(int(value));
}

但是,这不适用于作用域枚举。有没有适用于普通AND范围枚举的模板解决方案?

示例:

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"

1 个答案:

答案 0 :(得分:1)

好的,我知道了。

解决方案是不使用Q_ENUM宏中的作用域枚举。

错误:

Q_ENUM(Class::Enum)

正确:

Q_ENUM(Enum)

在大多数情况下,使用范围或非范围形式是等效的(当您在类内时)。通常,即使在类内部,我也总是使用范围限定的形式,只是要清楚我想说什么。但是似乎直接在宏中使用作用域枚举会破坏宏的功能。

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