Безопасно ли использовать enum для индексации массива? - PullRequest
0 голосов
/ 15 января 2020

Безопасно ли использовать enum для индексации массива? Например:

void messageToCerr( QtMsgType type,
                const QMessageLogContext& context,
                const QString& msg
              ) {
QVector<QString> typeName = {"Debug", "Warning", "Critical", "Fatal", "Info"};
QString output = QString( "[%1] %2" ).arg( typeName.at(type) ).arg( msg );
std::cerr << output.toStdString() << std::endl;
if ( type == QtMsgType::QtFatalMsg ) {

    abort();
}

}

Использует ли "тип", который

enum QtMsgType { QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg, QtSystemMsg }

, как индекс массива (вектора), безопасен? Я прочитал, что обход перечисления как массива небезопасен.

1 Ответ

1 голос
/ 15 января 2020

Да, то, что вы делаете, безопасно с учетом ваших определений, но я бы посоветовал объявить / определить вектор во время создания перечисления. Так что-то вроде:

enum QtMsgType { QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg, QtSystemMsg };
QVector<QString> typeName = {"Debug", "Warning", "Critical", "Fatal", "Info"};

Это также совершенно ясно даст понять, что ваш вектор неверен! Обратите внимание, что у перечисления Debug, Info, Warning, ... и ваш вектор Debug, Warning, Critical, .... Кроме того, нет смысла использовать изменяемый размер структуры, когда она является константой. Таким образом, вы можете просто иметь массив. Сложив все это вместе, выглядело бы так:

enum QtMsgType { QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg, QtSystemMsg };
QString typeName[] = {"Debug", "Info", "Warning", "Critical", "Fatal"};

Другой вариант - перегрузить оператор << для потоков для вашего enum, а затем вставить туда все логики c.

Для получения дополнительных опций взгляните на эту тему: Как преобразовать переменную типа enum в строку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...