此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());
答案 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_cast
或QVariant::value<>()
以及canConvert()
,例如:
QVariant v = q.value(2);
if (v.canConvert<MyEnumType>()) {
obj.setEnumType( qvariant_cast<MyEnumType>(v));
...
}