2016-07-19 3 views
2

Имеет ли этот литой статистик смысл ДЛЯ ЭТОГО ЭКСПЕРИМЕНТАЛЬНОГО ДЕЛА?Имеет ли static_cast смысл в функции getInt()?

QSqlQuery q; 
enum MyEnumType; 
obj.setMyEnumType(static_cast<MyEnumType>(q.value(2).toInt())); 

или является статическим приложением для ситуаций, когда тип источника не уверен, int?

функция набор

void setMyEnumType(MyEnumTypetype type) { m_type = type; } 

, что является преимуществом для простого броска?

obj.setMyEnumType((MyEnumType)q.value(2).toInt()); 
+0

да это делает, так как без него этот код не будет компилироваться – Slava

+0

@slava вы правы это accepty перечисление, но собирает даже без static_cast – wutzebaer

+0

без static_cast вы имеете в виду ваш пример с приведением стиля C? Да, что бы скомпилировать, но вы просто заменили один актер другим. – Slava

ответ

1

Это имеет смысл для преобразования из int к enum и обратно. Вы можете проверить граничные условия (например, int больше, чем последний элемент перечисления). Обратите внимание, что вы не выполняете функцию здесь, а возвращаете значение.

+0

does static_cast автоматически выполняет проверку границ? – wutzebaer

+0

@wutzebaer Нет, это не так. – user975989

+0

Так что же преимущества static_cast в этом случае? – wutzebaer

3

Да, отливка имеет прекрасный смысл. Давайте распороть это немного больше:

QSqlQuery q; 
enum MyEnumType; 
const auto v1 = q.value(2); // I don't know what the type of v1 will be. 
          // See the QSqlQuery docs. 
const auto v2 = v1.toInt(); // v2 is going to be an int or a long or something. 

obj.setMyEnumType(v2);  // Error: setMyEnumType doesn't take an int argument. 

const auto e = static_cast<MyEnumType>(v2); 
obj.setMyEnumType(e);  // OK. Argument is now the right type. 

Edit: Ах-ха! Я вижу, теперь вы задавали совершенно другой вопрос. Вопрос, который вы действительно задавали, представляет собой дубликат What is the difference between static_cast<> and C style casting?

Всегда предпочитайте static_cast, потому что a) разработчику кода будет предложено подумать «что произойдет, если значение вне диапазона?»; b) обозреватель кода не будет должен подумать: «Это статический_cast, реинтерпрет-литье, литье в const или какая-то комбинация из всех трех - и это безопасно?»

+0

, конечно, но в моем случае исходный тип ясен – wutzebaer

+0

@wutzebaer: я не понимаю ваш комментарий. Я просто разделил одно выражение, которое оценило аргумент 'setMyEnumType', в несколько выражений и сохранил промежуточные значения в именованных переменных. –

1

В этом случае ваш вопрос представляет собой небольшую проблему XY, так как QVariant обеспечивает встроенные проверки безопасности и литье.

Использование qvariant_cast или QVariant::value<>(), наряду с canConvert(), например:

QVariant v = q.value(2); 
if (v.canConvert<MyEnumType>()) { 
    obj.setEnumType(qvariant_cast<MyEnumType>(v)); 
    ... 
} 
Смежные вопросы