[英]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.