Предупреждения GCC для пользовательских типов, использующих QVariant :: Type в блоке коммутатора - PullRequest
0 голосов
/ 27 апреля 2018

Обычно мы отслеживаем типы объектов в переменной QVariant :: Type, а затем делаем что-то подобное

switch(values[i].type)
{
case QVariant::Bool: logic; break;
case QVariant::Int: logic; break;
case QVariant::LongLong: logic; break;
case QVariant::String:  logic; break;
case QVariant::Double:  logic; break;
case QVariant::DateTime:
case QVariant::Date:
case QVariant::Time:   logic; break;
case QVariant::User+1:
{
    logic;break;
}
case QVariant::User+2:
{
    logic;break;
}
default: break;
}

Проблема в том, что gcc выдает предупреждения в следующих строках для операторов User + X:

 warning: case value ‘1025’ not in enumerated type ‘QVariant::Type’ [-Wswitch]

Теперь я могу это подавить, конечно, но это рекомендуемый способ или я делаю что-то здесь в корне неправильно?

P.S. Вопрос не в , почему выдается предупреждение: я понимаю, почему. Задание больше касается правильного использования QVariant :: Type с пользовательскими типами, и если правильное подавление является правильным или то, что я делаю здесь, является просто неправильным, а предупреждение указывает на большую проблему при проектировании.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Если вы собираетесь использовать пользовательские типы в QVariant, вы должны использовать функцию-член userType :

К сожалению, это сделает все хуже:

auto u = [](auto& v){return static_cast<int>(v);};
switch(values[i].userType())
{
case u(QVariant::Bool): logic; break;
case u(QVariant::Int): logic; break;
case u(QVariant::LongLong): logic; break;
case u(QVariant::String):  logic; break;
case u(QVariant::Double):  logic; break;
case u(QVariant::DateTime):
case u(QVariant::Date):
case u(QVariant::Time):   logic; break;
case u(QVariant::User)+1:
{
    logic;break;
}
case u(QVariant::User)+2:
{
    logic;break;
}
default: break;
}

Для пояснения: обратите внимание, что функция-член type() всегда будет возвращать QVariant::UserType, когда значение типа больше QMetaType::User. Это означает, что он никогда не вернется QVariant::UserType+n! Как это могло? Эти значения не являются частью перечисления.

Вот о чем вас предупреждает gcc:

warning: case value ‘1025’ not in enumerated type ‘QVariant::Type’ [-Wswitch]

Поскольку 1025 (QVariant::User+1) не является частью QVariant::Type, эта метка регистра по сути является мертвым кодом.

Функция-член userType, однако, возвращает int. Он вернет то же базовое значение, что и type, если это значение ниже QMetaType::User, а также правильное пользовательское значение, если оно выше.

0 голосов
/ 27 апреля 2018

С QVariant::type enum:

QMetaType::User 1024    Base value for user types

это как:

switch(1024) {
   ...
   case (1024 + 1): break;
   default: break;
}

Управляющее правило в переключателе для enum должно быть явным .

(1024 + 1) не является явным, таким образом, предупреждение.

UPDATE

Согласно qvariant.html # type

Возвращает тип хранения значения, сохраненного в варианте. Хотя эта функция объявлена ​​как возвращающая QVariant :: Type, возвращаемая значение должно интерпретироваться как QMetaType :: Type. Особенно, QVariant::UserType возвращается сюда только если значение равно или больше, чем QMetaType :: User.

Таким образом, QVariant::UserType + 1 будет мертвым кодом.

Время до Реактор

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