Для целей регистрации я хочу преобразовать мои перечисления в удобочитаемые строки.Большую часть времени я использую перечисления с ограничением, поэтому мне нужно решение, которое также работает с перечислениями с ограничением.Qt предоставляет макрос Q_ENUM, чтобы избавить меня от лишней работы.Для преобразования перечисления в строку я могу написать:
QMetaEnum::fromType<Class::Enum>().valueToKey(int(enum))
Явное приведение к int необходимо для преобразования enum с областью видимости в int, так как valueToKey
должен вызываться с использованием интегрального значения.Это работает для ограниченных перечислений, но я хотел бы использовать какую-то функцию шаблона для преобразования.Я нашел следующее шаблонное решение в другом вопросе:
template<typename QEnum>
QString enumToString (QEnum value)
{
return QMetaEnum::fromType<QEnum>().valueToKey(int(value));
}
Но это не работает для перечисленных областей.Существует ли какое-либо шаблонное решение, которое также работает для простых и ограниченных перечислений?
ПРИМЕР:
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"