static_cast对getInt()函数有意义吗?

时间:2016-07-19 14:14:53

标签: c++ qt static-cast

此statis演员是否有意义 FOR THIS EXPLICIT CASE

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());

3 个答案:

答案 0 :(得分: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.

编辑:啊哈!我现在看到你问的是一个完全不同的问题。你真正问的问题是What is the difference between static_cast<> and C style casting?

的重复

总是更喜欢static_cast,因为a)会提示代码审核者思考“如果值超出范围会发生什么?”; b)代码审查员不会必须认为“这是一个static_cast,一个重新解释演员,一个const演员,还是三者的某种组合 - 这是安全的吗?”

答案 1 :(得分:1)

int转换为enum然后返回是完全合理的。您可以检查边界条件(例如,int大于枚举的最后一个元素)。请注意,您没有在此处转换函数,而是返回值。

答案 2 :(得分:1)

在这种情况下,您的问题有点XY问题,因为QVariant提供了内置的转换安全检查和转换。

使用qvariant_castQVariant::value<>()以及canConvert(),例如:

QVariant v = q.value(2);
if (v.canConvert<MyEnumType>()) {
    obj.setEnumType( qvariant_cast<MyEnumType>(v));
    ...
}