簡體   English   中英

Qt:使用模板函數將范圍枚舉轉換為字符串

[英]Qt: Convert scoped enum to string using a template function

出於記錄目的,我想將我的枚舉轉換為人類可讀的字符串。 大部分時間我都在使用作用域枚舉,因此我需要一個也適用於作用域枚舉的解決方案。 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"

好的,我明白了。

解決方案是不在Q_ENUM宏中使用作用域枚舉。

錯誤:

Q_ENUM(Class::Enum)

正確:

Q_ENUM(Enum)

對於大多數使用范圍或非范圍形式的用例是等效的(當你在類中時)。 我通常總是在課堂上使用范圍表格,只要清楚我想說什么。 但似乎直接在宏中使用scoped枚舉會破壞宏的功能。

也許對Qt有更深入了解的人可以解釋為什么會出現這種情況。 但我只記得在宏中使用范圍表單會使其破壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM