以同样的方式解决任何其他返回auto
的函数,其中不同的return
语句推导不同。你要么:
- 确保所有
return
s 具有相同的类型,或者
- 明确选择返回类型。
在这种情况下,int
s compare asstrong_ordering
而double
s compare as partial_ordering
,并且strong_ordering
可以隐式转换为partial_ordering
,您可以执行以下任一操作:
std::partial_ordering operator <=>(const QVariant& l, const QVariant& r) {
// rest as before
}
或显式转换整数比较:
case QMetaType::Int:
return std::partial_ordering(l.toInt() <=> r.toInt());
这给了你一个返回的函数partial_ordering
。
如果您想返回strong_ordering
,则必须将double
比较提升到更高的类别。您可以通过两种方式做到这一点:
您可以使用std::strong_order
,这是一个更昂贵的操作,但提供了对所有浮点值的总排序。然后你会写:
case QMetaType::Double:
return std::strong_order(l.toDouble(), r.toDouble());
或者你可以做一些像认为NaN
s ill-formed 的事情并以某种方式将它们扔掉:
case QMetaType::Double: {
auto c = l.toDouble() <=> r.toDouble();
if (c == std::partial_ordering::unordered) {
throw something;
} else if (c == std::partial_ordering::less) {
return std::strong_ordering::less;
} else if (c == std::partial_ordering::equivalent) {
return std::strong_ordering::equal;
} else {
return std::strong_ordering::greater;
}
}
这更乏味,但我不确定是否有更直接的方法来进行这种提升。